[Haskell-beginners] Haskell typing question

Cui Liqiang cui.liqiang at gmail.com
Tue Oct 28 12:00:29 UTC 2014


Thanks for your help, your suggestion works.

But I still don’t quite understand. In the following line:
caluDecimal l = (foldr1 (\x acc -> acc / 10.0 + x) (map digitToInt l)),
After applying digitToInt, the type of ‘x’ in the expression above is Int indeed, but Haskell consider the ’10.0’ to be a Int, is it?




----------------------------------------------------------------------------------------------------------------------------
Hi,
I am doing an exercise in Haskell, which is converting a string like ?$123.312? to double value. Below is my code:

module Main where
import Data.Char

caluInt l = foldl1 (\acc x -> acc * 10 + x) (map digitToInt l)
caluDecimal l = (foldr1 (\x acc -> acc / 10.0 + x) (map digitToInt l))

convert(x:xs) =
let num = [e | e <- xs, e /= ',']
intPart = takeWhile (/='.') num
decimalPart = tail(dropWhile (/='.') num)
in (caluInt intPart) + (caluDecimal decimalPart)


And I got an error in this line: caluDecimal l = (foldr1 (\x acc -> acc / 10.0 + x) (map digitToInt l)),
which says:
No instance for (Fractional Int) arising from a use of `/'
Possible fix: add an instance declaration for (Fractional Int)
In the first argument of `(+)', namely `acc / 10.0'
In the expression: acc / 10.0 + x
In the first argument of `foldr1', namely
`(\ x acc -> acc / 10.0 + x)'


Why Haskell insists that 10.0 is a Int? How can I explicitly tell Haskell I want a Fractional?
--
Cui Liqiang



> Why Haskell insists that 10.0 is a Int? How can I explicitly tell Haskell
> I want a Fractional?


Because digitToInt means exactly what it says. If you want it to become
something other than Int, apply fromIntegral to its result.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20141028/6a31fd25/attachment.html>


More information about the Beginners mailing list