为什么GHCi奇怪地输入这个陈述?

gat*_*ado 9 haskell typing ghc ghci

在回答有关stackoverflow的问题时,我注意到GHCi(交互式)在let语句中分配了一个限制性太强的类型.即,给定代码,

import Control.Arrow
f = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l)
Run Code Online (Sandbox Code Playgroud)

(作为我的回答对/sf/ask/439726941/#6283594),如果一次性插入"让"之前f和在ghci中输入它,它提供以下类型信息

Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)
Run Code Online (Sandbox Code Playgroud)

而只是要求表达式的类型给出正确的结果,即Ord a => [a] -> (a, Int).我正在使用ghc 7.0.3.

C. *_*ann 10

请参阅GHCi中使用的扩展默认规则,以解释其()来源.

至于为什么在这种情况下发生违约,请比较以下内容:

> let f x = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l) $ x
> :t f
f :: (Ord a) => [a] -> (a, Int)
Run Code Online (Sandbox Code Playgroud)

我认为这与单态的绑定有关,但我不确定细节.

  • 确实如此.使用`-XNoMonomorphismRestriction`运行GHCi会得到相同的结果. (3认同)