Lambda表达式类型推导咨询:推导函数c的类型步骤
Haskell函数类型推导:一步步拆解
c = \d -> d a b的类型 没问题,我来一步步带你推导这个函数的类型,咱们从已知信息开始拆解:
已知前提
- 函数
a的类型:a :: x -> Bool - 函数
b的类型:b :: Bool -> y
分析函数c的结构
首先看c的定义:c = \d -> d a b。这是一个lambda函数,它接收参数d,然后返回d a b的计算结果。要推导c的类型,我们需要先搞清楚参数d必须具备什么样的类型,再结合返回值的类型得出c的完整类型。
步骤1:拆解d a b的应用逻辑
在Haskell里,函数应用是左结合的,所以d a b等价于(d a) b。也就是说:
- 首先把
a作为参数传给d,得到一个中间结果 - 再把
b作为参数传给这个中间结果,得到最终返回值
步骤2:推导参数d的类型
我们分两步推导d的类型:
- 第一步:
d要能接收a作为参数。a的类型是x -> Bool,所以d的第一个参数类型必须是x -> Bool。假设d接收a后返回的中间结果类型为t,那么d的类型暂时可以写成:d :: (x -> Bool) -> t - 第二步:这个中间结果
t要能接收b作为参数。b的类型是Bool -> y,所以t必须是一个以Bool -> y为参数的函数,假设它返回的最终结果类型为z,那么t的类型是:t :: (Bool -> y) -> z - 把这两个结论结合起来,
d的完整类型就是:d :: (x -> Bool) -> (Bool -> y) -> z
步骤3:推导c的最终类型
c是一个接收d并返回d a b的函数:
- 输入:类型为
(x -> Bool) -> (Bool -> y) -> z的参数d - 输出:
d a b的结果,类型为z
所以c的类型就是:
c :: ((x -> Bool) -> (Bool -> y) -> z) -> z
这里的x、y、z都是类型变量,意味着它们可以是任意类型——只要满足d的类型约束,c就能正常工作。
内容的提问来源于stack exchange,提问作者bobaxs31
相关产品推荐
相关产品推荐

