为什么addString
调用与内联表达式不同?
Prelude> ((:).show) 1 [] ["1"] Prelude> let addString = ((:).show) Prelude> addString 1 []: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 []
bheklilr.. 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只是"得到"你必须在文件中编译时给出签名,但有一些它只是因为某种原因而混乱.
这是因为GHCi试图比GHC更严格地为您的函数选择类型签名.通常情况下,您不希望在GHCi中写出内联类型签名,因此它会尝试选择将执行的默认值.如果你问GHCi它选择了什么addString
,你得到
> :type addString addString :: () -> [String] -> [String]
如您所见,GHCi错误地采用了错误的类型签名.您可以通过将其添加到定义来解决此问题:
> let addString :: Show a => a -> [String] -> [String]; addString = ((:) . show) > addString 1 [] ["1"]
这是在许多其他情况下使其正常工作的已知且恼人的结果.有很多类型的GHCi只是"得到"你必须在文件中编译时给出签名,但有一些它只是因为某种原因而混乱.