
On Sat, May 30, 2009 at 6:33 PM, David Menendez
*Main> :t searchAll searchAll :: (Computation c) => Graph t t1 -> Int -> Int -> c [Int]
The way searchAll is written, the choice of which functions to use depends on the type variable c. That's determined by the calling context of searchAll, which is why you need to provide a type signature when using it at the GHCi command line.
This is actually one of the most interesting and important things to "get" about typeclasses; it's not *just* like an interface, because the instance type can appear in the result of a function and *not* in the arguments at all. In contrast, in Java/C++, the method to use is always chosen by the object being called; one could argue that all of COM is an attempt to get around this problem. Some examples:
fromInteger :: Num a => Integer -> a fromDynamic :: Typeable a => Dynamic -> Maybe a
In both of these cases, the choice of which instance to use is made by the caller, and often automatically by type inference:
test x = case fromDynamic x of Just s -> s == "hello" Nothing -> False
Now (test $ toDynamic "hello") = True, but (test $ toDynamic 'a') = False. Notice that I never directly specified what type "fromDynamic" should return; but the case statement forces it to return Maybe String, since I compare (s == "hello") -- ryan