以下假设的 Haskell 代码有什么问题?当我在大脑中编译它时,应该输出“1”。
那是什么意思?这不是有效的Rank-N多态吗? (免责声明:我绝对不是Haskell程序员,但OCaml不支持这种显式类型签名。)
foo :: forall a. forall b. forall c. (a -> b) -> c -> Integer -> b
foo f x n = if n > 0 then f True else f x
bar :: forall a. a -> Integer
bar x = 1
main = do
putStrLn (show (foo bar 1 2))
GHC抱怨:
$ ghc -XRankNTypes -XScopedTypeVariables poly.hs
poly.hs:2:28:
Couldn't match expected type `a' against inferred type `Bool'
`a' is a rigid type variable bound by
the type signature for `foo' at poly.hs:1:14
In the first argument of `f', namely `True'
In the expression: f True
In the expression: if n > 0 then f True else f x
poly.hs:2:40:
Couldn't match expected type `Bool' against inferred type `c'
`c' is a rigid type variable bound by
the type signature for `foo' at poly.hs:1:34
In the first argument of `f', namely `x'
In the expression: f x
In the expression: if n > 0 then f True else f x
那是什么意思?这不是有效的Rank-N多态吗? (免责声明:我绝对不是Haskell程序员,但OCaml不支持这种显式类型签名。)