【问题标题】:Haskell ASCII codesHaskell ASCII 码
【发布时间】:2013-10-04 19:37:16
【问题描述】:

我正在尝试创建一个函数,该函数采用 a(可以是任何类型:int、char...)并创建一个具有该输入复制与其 ASCII 码对应的次数。

我已经创建了这个:

toList n = 复制 (fromEnum n) n

当尝试在 cmd 中使用该函数时,它说它可以将预期的 int 类型与 char 匹配,然而如果我直接在 cmd 中使用我的函数并具有实际值,它会执行预期的操作.

我的意思是:toList 'a' --> 给我一个错误

replicate (fromEnum 'a') 'a' --> 给出没有问题的结果

我已经加载了模块 Data.Char (ord)

我该如何解决这个问题,为什么会这样?

提前致谢:)

【问题讨论】:

    标签: haskell module ascii


    【解决方案1】:

    您缺少的是类型声明。您说您希望它能够采用 any 类型,但您真正想要的是 toList 采用 Enum 的实例。当你在 GHCi 中使用它时,它会让你做let toList n = replicate (fromEnum n) n,因为 GHCi 会自动选择一些似乎有意义的默认值,但是当使用 GHC 编译模块时,如果没有类型声明,它将无法工作。你想要的

    toList :: (Enum a) => a -> [a]
    toList n = replicate (fromEnum n) n
    

    之所以必须在类型签名中包含(Enum a) =>,是因为fromEnum 具有类型签名(Enum a) => a -> Int。所以你看到它不仅采用 any 类型,还采用具有Enum 实例的那些类型。

    【讨论】:

    • 哦,对了,我明白了!那是因为只有可枚举类型才有 ASCII 码? (对不起,我是新手)
    • @ipg24 Enum 类型类与 ASCII 无关。如果您来自 OOP,请将它们视为简单的接口(目前,它们的功能远不止于此)。如果某物有Enum 的实例(即它的实现),那么它可以与整数相互转换,实际上没有什么比这更多的了。
    • 我看不出 GHC 无法推断出该类型的原因?
    • @Ingo,嗯,你是对的,GHC 可以推断类型。我的第一个假设(没有运行任何代码)是缺少类型签名会导致错误,但是当我将 ipg24 的代码复制到文件中并运行它时,我没有收到错误。
    • @ipg24 您能否编辑您的帖子以包含您遇到的错误?没有它就很难判断出了什么问题。
    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 2011-11-22
    • 1970-01-01
    • 2015-10-05
    • 2016-02-08
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多