haskell - Int vs Integer in class instance -
class visible tostring :: -> string size :: -> int inttostring :: (integral t) => t -> string inttostring 0 = "0" inttostring 1 = "1" inttostring 2 = "2" inttostring 3 = "3" inttostring 4 = "4" inttostring 5 = "5" inttostring 6 = "6" inttostring 7 = "7" inttostring 8 = "8" inttostring 9 = "9" inttostring n | ((div n 10) == 0) = (inttostring (mod n 10)) | otherwise = (inttostring (div n 10)) ++ (inttostring (mod n 10))
now
instance visible int tostring = inttostring size n = length (tostring n)
gives me error ambiguous type variable @ prompt if type (tostring 55)
but
instance visible integer tostring = inttostring size n = length (tostring n)
does not.
what gives?
there 2 things going on here. remember numeric literals in haskell polymorphic. is:
x = 55
really means
x :: num => x = fromintegral 55
this true numbers anywhere write them. can awkward work with, ghci implements type defaulting: assumes bare numbers integers
or doubles
if type ambiguous.
when write tostring 55
@ ghci prompt, ghci infers type (visible a, num a) => a
number 55. if have visible int
in scope, type default of integer
doesn't work because doesn't fulfill class constraint (there's no visible integer
), ghci complains ambiguous type variable because doesn't know type instantiate expression. if have visible integer
in scope, type default of integer works fine.
if want use type other integer, can use explicit type in tostring (55 :: int)
Comments
Post a Comment