Haskell没有(Num())的实例来自文字

时间:2013-11-30 15:29:28

标签: haskell

为什么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 []

1 个答案:

答案 0 :(得分:5)

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

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

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

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

这是在许多其他情况下使其正常工作的已知且恼人的后果。有很多类型的GHCi只是“得到”你必须在文件中编译时给出签名,但是有些类型只是因为某种原因而混乱。