gpt4 book ai didi

haskell - ghci 中的错误,我无法在书面的 haskell 文件中重现

转载 作者:行者123 更新时间:2023-12-04 14:45:05 24 4
gpt4 key购买 nike

我试图检查this stackoverflow answer使用 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]

不幸的是,我无法在书面的 haskell 文件中重现该错误:
-- file.hs
import Data.List

main = do
let m = head . sort
putStrLn $ show $ m [2,3,4]

使用 runhaskell file.hs 运行此文件给我期望值 2 .我在 ghci session 中的错误是什么?

编辑:我注意到,函数 m在 ghci 中有一个奇怪的类型:
> import Data.List
> let m = head . sort
> :t m
m :: [()] -> ()

为什么会这样?它不应该是 Ord a => [a] -> a 类型吗? ?对于 sorthead我得到了预期的类型:
> :t sort
sort :: Ord a => [a] -> [a]
> :t head
head :: [a] -> a

最佳答案

这是可怕的单态限制的错误。基本上,因为您没有为 m 指定类型,GHCi为你猜。在这种情况下,它猜测 m应该有类型 [()] -> () ,即使这显然不是你想要的。只要给m GHCi 中的类型签名你会没事的。

> :set +m  -- multiline expressions, they're handy
> let m :: Ord a => [a] -> a
| m = head . sort

您可以使用禁用单态限制
> :set -XNoMonomorphismRestriction

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

关于haskell - ghci 中的错误,我无法在书面的 haskell 文件中重现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22839784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com