Haskell错误:“缺少附带绑定”和“不在范围内”

时间:2011-03-20 20:21:49

标签: haskell compiler-errors

我创建了一段代码:

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

然而,当我运行它时,我收到此错误消息:

  

ChangeVowels.hs:2:1:       “ord”的类型签名缺少附带的绑定

     

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

     

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

我用Import data.char尝试过,但这也不起作用。

2 个答案:

答案 0 :(得分:17)

您需要为函数ord提供实现。 在这里,您已为ord提供了签名,但没有实施。

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

答案 1 :(得分:5)

删除该行:

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'