
| I hardly use any let expressions (shame on me??) and I am not very familiar | with them. But I figured out you might have mistaken, so I changed the bit | to: | antecedent :: Rule -> Expression | antecedent r = case r of | Ru{} -> if (rrsrt r == AlwaysExpr) then error ("(Module | ADLdataDef:) illegal call to antecedent of rule "++show r) | else | rrant r | Sg{} -> antecedent (srsig r) | Gc{} -> let x = grspe r in r `seq` Tm x | Fr{} -> frcmp r Indeed I was wrong, as others saw too. But in any case, I now realise that adding the `seq` makes the function stricter than Alternative 2, which your application presumably doesn't like. (Hence <<loop>>, I assume.) Try this instead, which should make it more like Alternative 2: Gc{} -> case r of { GC{ grspe = x } -> Tm x } My guess is that will behave like Alternative 2. Simon