为何pairer可与自身进行函数组合?Haskell类型适配疑问
为什么
pairer . pairer是合法的函数组合? 核心原因是Haskell的多态类型是参数化的,pairer的类型a -> [a]里的a是一个类型变量,可以匹配任意类型,包括列表类型本身。
先明确函数组合的类型规则:(.) :: (b -> c) -> (a -> b) -> a -> c,它要求左边函数的输入类型,等于右边函数的输出类型。
我们拆解pairer . pairer的类型推导过程:
- 右侧的
pairer:类型为x -> [x](换用变量x避免混淆),它的输出类型是[x] - 左侧的
pairer:因为要接收右侧的输出[x]作为输入,这里的类型变量a会被实例化为[x],于是左侧pairer的类型变为[x] -> [[x]]
此时两边的类型完全匹配:右侧输出[x],左侧输入[x],最终整个组合的类型是x -> [[x]],完全符合函数组合的规则。
举个具体例子,如果pairer是把输入包装成单元素列表的函数(比如pairer x = [x]),那pairer . pairer $ 5等价于pairer (pairer 5) = pairer [5] = [[5]],实际运行完全正常。
本质上是多态类型的灵活性让同一个函数可以适配不同的输入类型,只要满足类型变量的替换规则即可——pairer不是只能接受“基础”类型的输入,它可以接受任何类型,包括另一个列表类型。
内容的提问来源于stack exchange,提问作者stevenoakman
相关产品推荐
相关产品推荐

