[Haskell-cafe] Maintaining laziness

Jan Christiansen jac at informatik.uni-kiel.de
Fri Jan 16 11:45:14 EST 2009


Am 14.01.2009 um 15:26 schrieb Henning Thielemann:

> See the List functions in
>   http://hackage.haskell.org/cgi-bin/hackage-scripts/package/ 
> utility-ht
>
> Version 0.0.1 was before applying StrictCheck, 0.0.2 after  
> processing its suggestions. I have stopped when I saw that it  
> repeatedly shows examples where I expect, that they are unresolvable.

Thanks very much. Your library has provided me with an invaluable  
insight.

The original example from the IFL paper that showed problems with  
lists is reverse. StrictCheck states the following

You have to fulfil

f _|_ = _|_
      f (_|_ : _|_) = _|_ -> (_|_ : _|_)
           f (_|_ : []) = (_|_ : [])
           f (_|_ : (_|_ : _|_)) = _|_ -> (_|_ : (_|_ : _|_))
                f (_|_ : (_|_ : [])) = (_|_ : (_|_ : []))
                f (_|_ : (_|_ : (_|_ : _|_))) = _|_ -> (_|_ : (_|_ :  
(_|_ : _|_)))

That is, if the argument of reverse is known to have at least 2  
elements the result should have at least two elements. The only  
implementation I could imagine that fulfilled these requirements had  
a quadratic complexity. But your shorterList inspired me to an  
implementation that is not as efficient as the original one but which  
is linear. That is, there is a least strict implementation of reverse  
that is nearly as efficient as the standard implementation.

withSpineOf :: [a] -> [a] -> [a]
_ `withSpineOf` []     = []
l `withSpineOf` (_:ys) = x:xs `withSpineOf` ys
  where
   x:xs = l

rev xs = reverse xs `withSpineOf` xs

If anybody knows a prettier implementation of reverse that is least- 
strict I would be delighted to hear about it.


By the way, I was wrong that your example is similar to the reverse  
example. My new implementation of StrictCheck states that  
maybePrefixOf is least strict.

Cheers, Jan


More information about the Haskell-Cafe mailing list