Chad Scherrer wrote: > I was reading on p. 29 of "A History of Haskell" (a great read, by the > way) about the controversy of adding seq to the language. But other > than for efficiency reasons, is there really any new primitive that > needs to be added to support this? > > As long as the compiler doesn't optimize it away, why not just do > something like this (in ghci)? > > Prelude> let sq x y = if x == x then y else y > Prelude> 1 `sq` 2 > 2 > Prelude> (length [1..]) `sq` 2 > Interrupted. > > There must be a subtlety I'm missing, right?
The (sq x) function depends on x being an instance of typeclass Eq. Imagine a new typeclass Seq that is auto-defined for all types: class Seq a where seq :: a -> (b -> b) data Foo x = Bar x | Baz | Foo y x The instances always use a "case" to force just enough evaluation to compute the constructor, then return id: instance Seq Foo where seq a = case a of Bar _ -> id Baz -> id Foo _ _ -> id foo1,foo2 :: Foo Int foo1 = undefined foo2 = Bar 1 Now "(seq foo1) b" will also be undefined which "(seq foo2) b" will be "id b" which is "b". _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe