【发布时间】:2014-11-10 01:54:00
【问题描述】:
在关于函数式编程的讲座中,我们看到了以下 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” 在 `(+)' 的第一个参数中,即 `(z x)' 失败,加载的模块:无。为什么会这样?
【问题讨论】:
-
假设我像
f True 3 (\n -> n+1)一样调用f。您希望会发生什么? -
请记住,
f :: Bool -> Int -> (a -> Int) -> Int类型意味着 调用者 可以选择a。所以调用者可以选择String -> Int类型的函数。
标签: haskell polymorphism parametric-polymorphism