On Tuesday, October 28, 2014 at 8:00 PM, Cui Liqiang wrote:
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 whereimport Data.CharcaluInt 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 (/='.') numdecimalPart = 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 + xIn 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 LiqiangWhy Haskell insists that 10.0 is a Int? How can I explicitly tell HaskellI want a Fractional?Because digitToInt means exactly what it says. If you want it to becomesomething other than Int, apply fromIntegral to its result.