为什么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 []
答案 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只是“得到”你必须在文件中编译时给出签名,但是有些类型只是因为某种原因而混乱。