[Haskell-cafe] Re: Practise fingerspelling with Haskell! (Code cleanup request)

Mirko Rahn rahn at ira.uka.de
Mon Jul 23 01:50:04 EDT 2007


apfelmus wrote:

> Note that using Peano-numbers can achieve the same effect of stopping
> the length calculation as soon as more than one character is different.
> 
>   data Nat = Zero | Succ Nat deriving (Eq, Ord)
> 
>   instance Num Nat where
>     (Succ x) + y  = Succ (x+y)
>      Zero    + y  = y

Very nice (and quite fast), thanks for sharing this.

One point: Writing down the equations for (+) by looking at the left 
argument first, you introduce an additional constraint to the user 
program, since if we have

lenL [] = 0
lenL (x:xs) = 1 + lenL xs

lenR [] = 0
lenR (x:xs) = lenR xs + 1

then

*FingerSpell> (lenL (repeat ()) :: Nat) < 10
False
*FingerSpell> (lenR (repeat ()) :: Nat) < 10
*** Exception: stack overflow

So you can change a program that returns a proper value to one that 
loops by replacing lenL with lenR. Such problems are very difficult to 
track down, even if the library documentation states it very clearly.

/BR

-- 
-- Mirko Rahn -- Tel +49-721 608 7504 --
--- http://liinwww.ira.uka.de/~rahn/ ---


More information about the Haskell-Cafe mailing list