什么时候能减少改变功能的类型?

sac*_*eie 6 haskell typeclass pointfree

以下究竟发生了什么?

> let test = map show

> :t test
test :: [()] -> [String]

> :t (map show)
(map show) :: Show a => [a] -> [String]
Run Code Online (Sandbox Code Playgroud)

我想知道我以前怎么没注意到这个?我实际上遇到了"map fromIntegral"而不是show的问题 - 我的代码不能用无点的形式进行编译,但是在没有eta减少的情况下工作正常.

有关eta减少何时可以改变Haskell代码含义的简单解释?

gee*_*aur 12

这是单态限制,适用于绑定不接受参数并允许绑定在其他情况下不会由于多态性而可共享时,理论上如果您没有为它提供您想要的参数把它当作"不变"的东西 - 因此(共享).您可以禁用它ghci:set -XNoMonomorphismRestriction; 这通常很有用ghci,你常常希望这些表达式是完全多态的.(在Haskell源文件中,创建第一行

 {-# LANGUAGE NoMonomorphismRestriction #-}
Run Code Online (Sandbox Code Playgroud)

代替.)

  • 确切地说,这是单态限制与GHCi扩展的违约规则相结合. (9认同)