Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么GHCi会奇怪地键入此语句?_Haskell_Ghc_Typing_Ghci - Fatal编程技术网

Haskell 为什么GHCi会奇怪地键入此语句?

Haskell 为什么GHCi会奇怪地键入此语句?,haskell,ghc,typing,ghci,Haskell,Ghc,Typing,Ghci,在回答有关stackoverflow的问题时,我注意到GHCi(interactive)在let语句中指定了一个限制性太强的类型。也就是说,给定代码 import Control.Arrow f = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l) (正如我对的回答一样),如果在f之前插入一个“let”,并将其输入ghci,则会给出以下类型信息 P

在回答有关stackoverflow的问题时,我注意到GHCi(interactive)在let语句中指定了一个限制性太强的类型。也就是说,给定代码

import Control.Arrow
f = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l)
(正如我对的回答一样),如果在
f
之前插入一个“let”,并将其输入ghci,则会给出以下类型信息

Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)
而仅仅询问表达式的类型就可以得到正确的结果,即
orda=>[a]->(a,Int)
。我正在使用ghc 7.0.3。

有关
()
来源的解释,请参阅GHCi中使用的

关于在这种情况下发生默认的原因,请比较以下内容:

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

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

确实如此。使用
-xnomonomogomphismrestriction
运行GHCi会得到相同的结果。@哈马尔:谢谢,很好的回答!出于某种原因,我没有想到要尝试这样做,而且我也不确定GHCi是否在REPL中对绑定有其他特殊行为。