【问题标题】:Haskell errors: "lacks an accompanying binding" and "not in scope"Haskell 错误:“缺少随附的绑定”和“不在范围内”
【发布时间】:2011-03-20 20:21:48
【问题描述】:

我已经创建了一段代码:

intToDigit :: Char -> Int
ord :: Char -> Int
intToDigit c = ord c - ord 'a'

但是,当我运行它时,我会收到以下错误消息:

改变元音.hs:2:1: `ord' 的类型签名缺少伴随的绑定

ChangeVowels.hs:4:16:不在范围内:`ord'

ChangeVowels.hs:4:24:不在范围内:`ord'

我用Import data.char 尝试过,但也没有用。

【问题讨论】:

  • 注意大写很重要:你的导入行应该是import Data.Char(或者import Data.Char hiding (intToDigit))。
  • @Dave 或更好,import Data.Char (ord)
  • 此外,如果您偶然将函数名称小写,以便在类型声明中有 intToDigit 并在实现中使用 inttodigit,您将缺少随附的 yada yada。我学会了艰难的方式...

标签: haskell compiler-errors


【解决方案1】:

您需要提供函数ord 的实现。 这里,你给ord签名了,但是没有实现。

或者你可以使用Haskell自己的ord函数,即Char.ord

【讨论】:

    【解决方案2】:

    删除线:

    ord :: Char -> Int  
    

    或者给它一个定义。

    将你的函数命名为 intToDigit 是个坏主意,因为它已经在 Data.Char 中用于与你正在做的相反的事情。

    您的函数是 Data.Char.digitToInt,它的实现也适用于十六进制:

    digitToInt :: Char -> Int
    digitToInt c
     | isDigit c            =  ord c - ord '0'
     | c >= 'a' && c <= 'f' =  ord c - ord 'a' + 10
     | c >= 'A' && c <= 'F' =  ord c - ord 'A' + 10
     | otherwise            =  error ("Char.digitToInt: not a digit " ++ show c) -- sigh
    

    其实不是你定义的……为什么'a'在你的代码里?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多