-eval :: (Expr a) -> Sem Val\r
-eval (New _) = return (S [])\r
-eval (Insert _ e s) = eval e >>. \a.eval s >>..\r
- \x.return (S ('List'.union [a] x))\r
-eval (Delete _ e s) = eval e >>. \a.eval s >>..\r
- \x.return (S ('List'.delete a x))\r
-eval (Variable _ i) = read i\r
-eval (Assign _ v e) = eval e >>= store v\r
-eval (Union _ s1 s2) = eval s1 >>.. \x.eval s2\r
- >>.. \y.return (S ('List'.union x y))\r
-eval (Difference _ s1 s2) = eval s1 >>.. \x.eval s2\r
- >>.. \y.return (S ('List'.difference x y))\r
-eval (Intersection _ s1 s2) = eval s1 >>.. \x.eval s2 \r
- >>.. \y.return (S ('List'.intersect x y))\r
-eval (Integer _ i) = return (I i)\r
-eval (Size _ s) = eval s >>.. \x.return (I (length x))\r
-eval (Oper _ e1 o e2) = eval e1 >>. \a.eval e2 >>. \b.return (I (case o of\r
+eval :: (Expr a) -> Sem a | TC a\r
+eval (New {f}) = return (f [])\r
+eval (Variable {f} i) = read i\r
+eval (Assign {f} v e) = eval e >>= \a.store v a\r
+eval (Insert {f} e s) = eval e >>= \a.eval s \r
+ >>= \x.return (f ('List'.union [a] x))\r
+eval (Delete {f} e s) = eval e >>= \a.eval s\r
+ >>= \x.return (f ('List'.delete a x))\r
+eval (Union {f} s1 s2) = eval s1 >>= \x.eval s2\r
+ >>= \y.return (f ('List'.union x y))\r
+eval (Difference {f} s1 s2) = eval s1 >>= \x.eval s2\r
+ >>= \y.return (f ('List'.difference x y))\r
+eval (Intersection {f} s1 s2) = eval s1 >>= \x.eval s2 \r
+ >>= \y.return (f ('List'.intersect x y))\r
+eval (Integer {f} i) = return (f i)\r
+eval (Size {f} s) = eval s >>= \x.return (f (length x))\r
+eval (Oper {f} e1 o e2) = eval e1 >>= \a.eval e2 >>= \b.return (f (case o of\r