在关于函数式编程的讲座中,我们看到了以下 Haskell 函数:
f :: Bool -> Int -> (a -> Int) -> Int
f x y z = if x then y + y else (z x) + (z y)
预计此功能将无法进行类型检查。但是,没有解释发生这种情况的原因。在 GHCI 中尝试时,我得到以下输出:
Prelude> :l test [1 of 1] 编译 Main ( test.hs,
解释)
测试.hs:2:35:
无法将预期类型“a”与实际类型“Bool”匹配
`a' 是一个刚性类型变量,由
f :: Bool -> Int -> (a -> Int) -> Int 的类型签名
在 test.hs:1:6
相关绑定包括
z :: a -> Int(绑定在 test.hs:2:7)
f :: Bool -> Int -> (a -> Int) -> Int (绑定在 test.hs:2:1)
在“z”的第一个参数中,即“x”
在 `(+)' 的第一个参数中,即 `(zx)' 失败,加载的模块:无。
为什么会这样?