在关于函数式编程的讲座中,我们看到了以下 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)' 失败,加载的模块:无。
为什么会这样?