Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Haskell errors: "lacks an accompanying binding" and "not in scope"

I have created a piece of code this:

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

However, when I run it I get this error message:

ChangeVowels.hs:2:1: The type signature for `ord' lacks an accompanying binding

ChangeVowels.hs:4:16: Not in scope: `ord'

ChangeVowels.hs:4:24: Not in scope: `ord'

I tried it with Import data.char but that doesnt work either.

like image 534
anon1 Avatar asked Mar 20 '11 20:03

anon1


2 Answers

You need to provide an implementation for the function ord. Here, you have given a signature for ord, but no implementation.

Or you can use Haskell's own ord function, that is Char.ord.

like image 176
ChrisJ Avatar answered Nov 03 '22 02:11

ChrisJ


Remove the line:

ord :: Char -> Int  

Or give it a definition.

And it's a bad idea to name your function intToDigit, while it's already used in Data.Char to do the opposite of what you are doing.

Your function is Data.Char.digitToInt, and its implementation also works with hexadecimal:

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

Actually it's not what you defined... why 'a' in your code?

like image 21
Ptival Avatar answered Nov 03 '22 00:11

Ptival