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

Reply via email to