ghci中的错误,无法在写入的haskell文件中重现

ghci中的错误,无法在写入的haskell文件中重现,haskell,ghci,runhaskell,Haskell,Ghci,Runhaskell,我尝试与ghci进行检查,发现以下错误: > import Data.List > let m = head . sort > m [2,3,4] <interactive>:5:4: No instance for (Num ()) arising from the literal `2' Possible fix: add an instance declaration for (Num ()) In the expression: 2

我尝试与ghci进行检查,发现以下错误:

> import Data.List
> let m = head . sort
> m [2,3,4]

<interactive>:5:4:
   No instance for (Num ()) arising from the literal `2'
   Possible fix: add an instance declaration for (Num ())
   In the expression: 2
   In the first argument of `m', namely `[2, 3, 4]'
   In the expression: m [2, 3, 4]
使用
runhaskell file.hs运行此文件时,会得到预期值
2
。我在ghci会议中犯了什么错误

编辑:我注意到,
m
函数在ghci中有一个奇怪的类型:

> import Data.List
> let m = head . sort
> :t m
m :: [()] -> ()
为什么会这样?它不应该有类型
Ord a=>[a]->a
?对于
sort
head
我得到了预期的类型:

> :t sort
sort :: Ord a => [a] -> [a]
> :t head
head :: [a] -> a

这是可怕的单态限制的错误。基本上,因为您没有为
m
指定类型,所以GHCi会为您猜测它。在本例中,它猜测
m
应该具有
[()]->()
类型,尽管这显然不是您想要的。只要在
GHCi
中给
m
一个类型签名,你就没事了

> :set +m  -- multiline expressions, they're handy
> let m :: Ord a => [a] -> a
|     m = head . sort
您可以使用禁用单态限制

> :set -XNoMonomorphismRestriction

但它通常非常方便,否则您必须为在交互模式下通常不会使用的东西指定许多类型。

可怕的单体主义限制再次出现。在ghci中运行代码之前,请尝试执行一个
:set-XNoMonomorphismRestriction
。@fjh:现在它可以工作了!谢谢你能解释一下,为什么ghci猜测
[()]->>()
?基本上,因为它是满足Ord a=>[a]->a施加的约束的“最简单”类型。
> :set -XNoMonomorphismRestriction