9

在回答有关 stackoverflow 的问题时,我注意到 GHCi(交互式)在let语句中分配了一个过于严格的类型。即,给定代码,

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

(如我对https://stackoverflow.com/questions/6281813/maximum-of-list-and-count-of-repeat-maximum-number/6283594#6283594的回答),如果一个人在之前f和在 ghci 中输入 this,它会给出以下类型信息

Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)

而仅仅询问表达式的类型会给出正确的结果,即Ord a => [a] -> (a, Int). 我正在使用 ghc 7.0.3。

4

1 回答 1

10

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

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

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

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

于 2011-06-08T19:05:49.250 回答