在一次函数式编程的讲座中,我们看到了以下Haskell函数:
预计此功能将无法通过类型检查。但是,发生这种情况的原因没有得到解释。在GHCI中尝试时,我得到了以下输出:
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] Compiling Main ( test.hs, interpreted )为什么会发生这种情况?
test.hs:2:35: Couldn't match expected type `a' with actual type `Bool' `a' is a rigid type variable bound by the type signature for f :: Bool -> Int -> (a -> Int) -> Int at test.hs:1:6 Relevant bindings include z :: a -> Int (bound at test.hs:2:7) f :: Bool -> Int -> (a -> Int) -> Int (bound at test.hs:2:1) In the first argument of `z', namely `x' In the first argument of `(+)', namely `(z x)' Failed, modules loaded: none.
f
:f True 3 (\n -> n+1)
。你会期望发生什么? - Tom Ellisf :: Bool -> Int -> (a -> Int) -> Int
意味着调用者可以选择a
的类型。因此,调用者完全可以选择一个类型为String -> Int
的函数。 - augustss