6

以下到底是怎么回事?

> let test = map show

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

> :t (map show)
(map show) :: Show a => [a] -> [String]

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

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

4

1 回答 1

12

这是单态限制,它适用于绑定不接受参数并允许绑定在其他情况下不是由于多态性而可共享的情况,理论上如果你不给它一个你想要的参数将其视为“恒定”的东西(因此共享)。您可以ghci使用:set -XNoMonomorphismRestriction;禁用它 这在 中通常很有用ghci,您通常希望此类表达式完全多态。(在 Haskell 源文件中,使第一行

 {-# LANGUAGE NoMonomorphismRestriction #-}

反而。)

于 2012-04-25T06:27:08.203 回答