Well, it's easy to make it so that lists are either finite or bottom,
but it's not so easy to make infinite lists fail to typecheck...
That's what I'm wondering about.

2010/10/13 Miguel Mitrofanov <miguelim...@yandex.ru>:
>  hdList :: List a n -> Maybe a
> hdList Nil = Nothing
> hdList (Cons a _) = Just a
>
> hd :: FiniteList a -> Maybe a
> hd (FL as) = hdList as
>
> *Finite> hd ones
>
> this hangs, so, my guess is that ones = _|_
>
>
> 13.10.2010 12:13, Eugene Kirpichov пишет:
>>
>> {-# LANGUAGE ExistentialQuantification, GADTs, EmptyDataDecls #-}
>> module Finite where
>>
>> data Zero
>> data Succ a
>>
>> class Finite a where
>>
>> instance Finite Zero
>> instance (Finite a) =>  Finite (Succ a)
>>
>> data List a n where
>>   Nil :: List a Zero
>>   Cons :: (Finite n) =>  a ->  List a n ->  List a (Succ n)
>>
>> data FiniteList a where
>>   FL :: (Finite n) =>  List a n ->  FiniteList a
>>
>> nil :: FiniteList a
>> nil = FL Nil
>>
>> cons :: a ->  FiniteList a ->  FiniteList a
>> cons a (FL x) = FL (Cons a x)
>>
>> list123 = cons 1 (cons 2 (cons 3 nil))
>>
>> ones = cons 1 ones -- typechecks ok
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>



-- 
Eugene Kirpichov
Senior Software Engineer,
Grid Dynamics http://www.griddynamics.com/
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to