-- OPT (subs e1 old new) >>= (\e1 -> (subs e2 old new) >>= (\e2 -> return $ AppExpr e1 e2))
subs le@(ListExpr es) old new = liftM ListExpr (mapM (\e -> subs e old new) es)
subs le@(ListExpr es) old new = liftM ListExpr (mapM (\e -> subs e old new) es)
subs le@(ListExpr es) old new = liftM ListExpr (mapM (\e -> subs e old new) es)