[Haskell-cafe] beginner's problem about lists
David Sabel
sabel at ki.informatik.uni-frankfurt.de
Wed Oct 11 10:45:22 EDT 2006
Malcolm Wallace wrote:
> Matthias Fischmann <fis at wiwi.hu-berlin.de> wrote:
>
>
>>> No, your Fin type can also hold infinite values.
>>>
>> let q = FinCons 3 q in case q of FinCons i _ -> i ==> _|_
>>
>> does that contradict, or did i just not understand what you are
>> saying?
>>
>
> That may be the result in ghc, but nhc98 gives the answer 3.
>
> It is not entirely clear which implementation is correct. The Language
> Report has little enough to say about strict components of data
> structures - a single paragraph in 4.2.1. It defines them in terms of
> the strict application operator ($!), thus ultimately in terms of seq,
> and as far as I can see, nhc98 is perfectly compliant here.
>
> The definition of seq is
> seq _|_ b = _|_
> seq a b = b, if a/= _|_
>
> In the circular expression
> let q = FinCons 3 q in q
> it is clear that the second component of the FinCons constructor is not
> _|_ (it has at least a FinCons constructor), and therefore it does not
> matter what its full unfolding is.
>
The translation given in the language report says this expression is
equivalent to
let q = (\x1 x2 -> (( FinCons' $ x1) $! x2) ) 3 q in q
(where FinCons' is a "lazy" constructor)
in terms of seq
let q = (\x1 x2 -> x2 `seq` ( FinCons' x1 x2 ) ) 3 q in q
this evaluates to
let q = (q `seq` ( FinCons' 3) ) in q
hence on top-level q is rather a seq-expression than a
constructor-expression ;-)
Regards,
David
More information about the Haskell-Cafe
mailing list