Cristiano Paris wrote:
class FooOp a b where
 foo :: a -> b -> IO ()

instance FooOp Int Double where
 foo x y = putStrLn $ (show x) ++ " Double " ++ (show y)

partialFoo = foo (10::Int)

bar = partialFoo (5.0::Double)

The Haskell type classes system works in an "open world assumption": while the compiler can see the class instances in your code, it does not assume there are not others elsewhere (e.g. in another module).

In your example, the compiler can not prove that the only instance matching

  prog = partialFoo 5.0 10

is the one you wrote, unless you restrict the numeric constants to specific types as you did. Indeed, assume that in another module there is the instance

  instance FooOp Double Double where
    foo _ _ = putStrLn "DD"

what should then be the result of your program prog? 10 might be a Double after all, and "DD" could be as good a result as "5.0 Double 10". Being ambiguous, the program is rejected. Due to the open world assumption, your program is rejected as well.

Regards,
Zun.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to