以下内容究竟发生了什么?
> let test = map show
> :t test
test :: [()] -> [String]
> :t (map show)
(map show) :: Show a => [a] -> [String]
我想知道我以前怎么没注意到这个?我实际上遇到了“map fromIntegral”而不是show的问题 - 我的代码没有使用无点格式编译,但在没有eta缩减的情况下工作正常。
是否有一个简单的解释,说明何时eta减少可以改变Haskell代码的含义?
答案 0 :(得分:12)
这是monomorphism restriction,当绑定不接受参数并且允许绑定在其他情况下不会由于多态时可以共享时适用,理论上如果你不给它是一个参数,你想把它当作“常量”-ish(因此共享)。您可以使用ghci
在:set -XNoMonomorphismRestriction
中将其停用;这通常在ghci
中很有用,你经常希望这些表达式是完全多态的。 (在Haskell源文件中,创建第一行
{-# LANGUAGE NoMonomorphismRestriction #-}
代替。)