GADTs and functional dependencies
Chris Kuklewicz
haskell at list.mightyreason.com
Tue Sep 23 13:44:20 EDT 2008
You cannot create a normal function "fun". You can make a type class function
fun :: Class a b => GADT a -> b
> data GADT a where
> GADT :: GADT ()
> GADT2 :: GADT String
>
> -- fun1 :: GADT () -> () -- infers type
> fun1 g = case g of
> (GADT :: GADT ()) -> ()
>
> -- fun2 :: GADT String -> Bool -- infers type
> fun2 g = case g of
> (GADT2 :: GADT String) -> True
>
> -- "fun" cannot type check. The type of 'g' cannot be both "GADT ()" and "GADT String"
> -- This is because "fun" is not a member of type class.
> {-
> fun g = case g of
> (GADT :: GADT ()) -> ()
> (GADT2 :: GADT String) -> True
> -}
>
> class Class a b | a -> b where
> fun :: GADT a -> b
>
> instance Class () () where
> fun GADT = ()
>
> instance Class String Bool where
> fun GADT2 = True
>
> main = print $ (fun GADT, fun GADT2) == ( (), True )
>
More information about the Glasgow-haskell-users
mailing list