[Haskell-cafe] Re: having fun with GADT's
Anatoly Yakovenko
aeyakovenko at gmail.com
Mon Sep 22 22:20:59 EDT 2008
> data Nat a where
> Z :: Nat a
> S :: Nat a -> Nat (S a)
>
> data Z
> data S a
>
> n00 = Z
> n01 = S n00
> n02 = S n01
> n03 = S n02
> n04 = S n03
>
> data MaxList t where
> Nil :: MaxList a
> Cons :: Nat a -> MaxList a -> MaxList a
>
> a = Cons n02 $ Cons n02 $ Cons n01 $ Nil
> --- ":t a" gives "forall a. MaxList (S (S a))" which tells you exactly
> --- what you want: elements are at least 2.
>
> mlTail :: forall t. MaxList t -> MaxList t
> mlTail (Cons h t) = t
Is there a way to define a function that only takes a list with a max
of 1? Because
only1 :: MaxList (S a) -> String
only1 _ = "only1"
will work over
> a = Cons n02 $ Cons n02 $ Cons n01 $ Nil
without any problems
More information about the Haskell-Cafe
mailing list