[Haskell-cafe] Missing a "Deriving"?
Ryan Ingram
ryani.spam at gmail.com
Sun May 31 00:45:58 EDT 2009
On Sat, May 30, 2009 at 6:33 PM, David Menendez <dave at zednenem.com> wrote:
> *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
More information about the Haskell-Cafe
mailing list