如何手动推导Haskell中函数组合flip . const的类型?
手动推导Haskell函数组合
flip . const的类型 嘿,我来一步步带你搞明白怎么手动推导这个类型,其实核心就是抓住函数组合的类型匹配规则,咱们慢慢来,别怕变量多~
首先,先明确几个基础类型:
函数组合运算符
.的类型:(.) :: (c -> d) -> (a -> c) -> a -> d简单说就是:如果
f的类型是c->d,g的类型是a->c,那f.g的类型就是a->d——因为g的输出正好能喂给f当输入。已知的两个函数类型(为了避免和组合的变量冲突,我先把原类型的变量名换一下,后面再统一):
flip :: (x -> y -> z) -> y -> x -> z const :: p -> q -> p -- 等价于 p -> (q -> p),因为Haskell默认右结合
接下来开始匹配推导:
- 我们要算的是
flip . const,对应组合里的f = flip,g = const。 - 首先把
flip的类型和组合里的c->d对齐:flip的类型是(x -> y -> z) -> y -> x -> z,所以:c = (x -> y -> z)(flip的输入类型)d = y -> x -> z(flip的输出类型)
- 然后把
const的类型和组合里的a->c对齐:const的类型是p -> (q -> p),所以:a = p(const的输入类型)c = q -> p(const的输出类型)
现在关键来了:上面两个c是同一个东西,所以可以联立等式:(x -> y -> z) = q -> p
根据Haskell的类型匹配规则,函数类型是逐段对应的:
- 左边函数的参数
x= 右边函数的参数q→x = q - 左边函数的返回值
y -> z= 右边函数的返回值p→p = y -> z
现在把这些替换回组合的结果类型a->d:
a = p = y -> zd = y -> x -> z,而x = q,不过咱们可以把变量名换成更直观的(和GHCi输出对齐):
把y换成b,z换成c,q换成a,p换成b->c,这样:a = b -> cd = b -> a -> c
最终组合的类型就是a -> d,也就是:
(flip . const) :: (b -> c) -> b -> a -> c
和GHCi给出的结果完全一致!
总结一下核心思路:函数组合的本质是“后一个函数的输出作为前一个函数的输入”,所以推导时就是把两个函数的类型按这个规则对齐,联立变量等式,最后替换得到结果。
内容的提问来源于stack exchange,提问作者Николай Герасимов
相关产品推荐
相关产品推荐

