[Haskell-cafe] Expressing seq
bertram.felgenhauer at googlemail.com
Wed Sep 27 18:10:21 EDT 2006
Chad Scherrer wrote:
> Prelude> let sq x y = if x == x then y else y
> Prelude> 1 `sq` 2
> Prelude> (length [1..]) `sq` 2
> There must be a subtlety I'm missing, right?
Two, at least:
First, your sq has a different type, as it requires an Eq instance:
Prelude> :t sq
sq :: (Eq a) => a -> t -> t
Prelude> :t seq
seq :: a -> b -> b
Secondly, your sq is more akin to a deepSeq in that it forces all of
its value instead of just evaluating to weak head normal form.
Prelude> [undefined] `seq` 1
Prelude> [undefined] `sq` 1
*** Exception: Prelude.undefined
You could implement seq explicitely for many types, for example,
seqList  x = x
seqList (_:_) x = x
but not for function types.
More information about the Haskell-Cafe