[Haskell-cafe] problem with IO, strictness, and "let"
Stefan O'Rear
stefanor at cox.net
Fri Jul 13 19:59:53 EDT 2007
On Fri, Jul 13, 2007 at 04:29:12PM -0700, Michael Vanier wrote:
> Albert,
>
> Thanks for the very detailed reply! That's the great thing about this
> mailing list.
>
> I find your description of seq somewhat disturbing. Is this behavior
> documented in the API? I can't find it there. It suggests that perhaps
> there should be a really-truly-absolutely-I-mean-right-now-seq function
> that evaluates the first argument strictly no matter what (not that this
> should be something that gets used very frequently). Or are there reasons
> why this is not feasible?
>
> Sorry to belabor this. Learning to think lazily is IMO one of the hardest
> aspects of learning Haskell.
Can you clarify what you mean by really-truly-absolutely-I-mean-right-now-seq?
The entire specification of seq is in <http://haskell.org/onlinereport/basic.html#sect6.2>:
The function seq is defined by the equations:
seq ⊥ b = ⊥
seq a b = b, if a ≠ ⊥
In particular, seq is not defined in terms of evaluation.
Even in a lazy model, you cannot assume any *order* of evaluation, only
that both arguments will be demanded if the whole expression is. *if*
the whole expression is.
Seq is uniform - for ALL data types on the lhs, it evaluates it to WHNF
(seeing the top constructor or lambda). A recursive seq would not be
uniform, and would require a type class or just specialization.
If you can see why (x `seq` x) is redundant, you probably understand
laziness.
Perhaps it would help to see a definition of seq in Haskell?
class Eval a where
seq :: a -> b -> b
instance Eval (a,b) where
seq (x,y) b = b
instance Eval [a] where
seq [] b = b
seq (x:xs) b = b
instance Eval (Maybe a) where
seq Nothing b = b
seq (Just x) b = b
instance Eval (Either a b) where
seq (Left x) b = b
seq (Right x) b = b
instance Eval Bool where
seq True b = b
seq False b = b
instance Eval Int where
...
seq (-1) b = b
seq 0 b = b
seq 1 b = b
...
?
Stefan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20070713/c89b201a/attachment.bin
More information about the Haskell-Cafe
mailing list