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

 石pimentel_958 发布于 2023-02-13 17:22

为什么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只是"得到"你必须在文件中编译时给出签名,但有一些它只是因为某种原因而混乱.

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只是"得到"你必须在文件中编译时给出签名,但有一些它只是因为某种原因而混乱.

    2023-02-13 17:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有