Chris Wong wrote:
>> data Person :: Gender -> * where
>> Dead :: Person Gender -- WHAT DO I PUT HERE
>> Alive :: { name :: String
>> , weight :: Float
>> , father :: Person Gender } -> Person Gender
>
> Here's the problem. In the line:
>
> Dead :: Person Gender
>
> you are referring to the Gender *type*, not the Gender kind.
>
> To refer to the kind instead, change this to:
>
> Dead :: forall (a :: Gender). Person a
>
> This means "for all types A which have the kind Gender, I can give you
> a Person with that type." The Alive declaration and deriving clause
> can be fixed in a similar way.
>
> Also, to enable the "forall" syntax, you need to add
>
> {-# LANGUAGE ExplicitForAll #-}
>
> at the top of the file.
Thanks a lot for your help. I did not realize the possible usage of "a::b"
to indicate "any type a of kind b". So I have adapted my code, and the
following version is working correctly:
----------------------------
{-# LANGUAGE GADTs #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
data Gender = Male | Female
data Person :: Gender -> * where
Dead :: Person (a :: Gender)
Alive :: { name :: String
, weight :: Float
, father :: Person (a::Gender) } -> Person (b :: Gender)
deriving instance Show (Person (a::Gender))
main = do
let a = Alive "Joe" 60 Dead :: Person Female
let b = Alive "Jim" 70 a :: Person Male
----------------------------
However, I have not managed to make the version with forall work. Below, the
first occurrence of forall is ok, but the three following yield error.
----------------------------
{-# LANGUAGE GADTs #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ExplicitForAll #-}
data Gender = Male | Female
data Person :: Gender -> * where
Dead :: forall (a :: Gender). Person a
Alive :: { name :: String
, weight :: Float
, father :: forall (a :: Gender). Person a } -> forall (b ::
Gender). Person b
deriving instance Show (forall (a :: Gender). Person a)
main = do
let a = Alive "Joe" 60 Dead :: Person Female
let b = Alive "Jim" 70 a :: Person Male
----------------------------
Thanks,
TP
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe