let addString = ((:).show) Prelude-6ren">
gpt4 book ai didi

Haskell 没有从字面量中产生 (Num ()) 的实例

转载 作者:行者123 更新时间:2023-12-02 10:40:49 25 4
gpt4 key购买 nike

为什么 addString 调用与内联表达式不同?

Prelude> ((:).show) 1 []
["1"]
Prelude> let addString = ((:).show)
Prelude> addString 1 []

<interactive>:99:11:
No instance for (Num ()) arising from the literal `1'
Possible fix: add an instance declaration for (Num ())
In the first argument of `addString', namely `1'
In the expression: addString 1 []
In an equation for `it': it = addString 1 []

最佳答案

这是因为 GHCi 尝试比 GHC 更严格地为您的函数选择类型签名。通常情况下,您不想在 GHCi 中写出内联类型签名,因此它会尝试选择将执行的默认值。如果你问 GHCi 它为 addString 选择了什么,你会得到

> :type addString
addString :: () -> [String] -> [String]

如您所见,GHCi 错误地假定了错误的类型签名。您可以通过将其添加到定义中来解决此问题:

> let addString :: Show a => a -> [String] -> [String]; addString = ((:) . show)
> addString 1 []
["1"]

这是让它在许多其他情况下正常工作的已知且令人烦恼的后果。 GHCi 只是“获取”了很多类型,您在将其编译到文件中时必须为其提供签名,但也有一些类型会因某种原因而变得困惑。

关于Haskell 没有从字面量中产生 (Num ()) 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20301976/

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