Dan Mead wrote:
Andrew: Try using catchalls in your guards
pattern1
| guard1 =
| guard2 =
| otherwise =
This makes it much easier to use pattern guards.
"otherwise" is a reserved word used for this stuff in ghc.
Yeah, it's good practice to include an explicit otherwise clause - but
in this specific instance, I'm trying to do tricky stuff where one rule
falls through to another if some condition doesn't hold - but that
condition is only expressible as a function.
Well, let me show you the code - somebody will probably recognise this
stuff...
convert1 :: Expression -> Expression
convert1 S = S
convert1 K = K
convert1 I = I
convert1 (Var v) = Var v
convert1 (x :@: y) = (convert1 x) :@: (convert1 y)
convert1 (Lam n e)
| n `not_in` e = K :@: (convert1 e)
convert1 (Lam n (Var v))
| n == v = I
| otherwise = K :@: (convert1 (Var v))
convert1 (Lam n (x :@: y))
| y `is_var` n && n `not_in` x = convert1 x
| otherwise = S :@: (convert1 (Lam n x)) :@:
(convert1 (Lam n y))
convert1 (Lam n (Lam m e))
| n `not_in` e = K :@: (convert1 (Lam m e))
| otherwise = convert1 (Lam n (convert1 (Lam m e)))
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe