+instance toString Expr where
+ toString e = concat $ print e
+
+printSelectors :: [FieldSelector] -> [String]
+printSelectors x = case x of [] = [""]; _ = [".":printersperse "." x]
+
+printFunCall :: String [Expr] [FieldSelector] -> [String]
+printFunCall s args fs = [s, "(":printersperse "," args] ++ [")"] ++
+ printSelectors fs
+
+derive gEq Op2
+instance == Op2 where (==) o1 o2 = gEq{|*|} o1 o2
+
+instance zero Pos where
+ zero = {line=0, col=0}
+
+derive gEq Op1
+instance == Op1 where (==) o1 o2 = gEq{|*|} o1 o2
+instance < Op2 where (<) o1 o2 = toString o1 < toString o2
+instance < Op1 where (<) o1 o2 = toString o1 < toString o2
+
+derive gEq Type
+instance == Type where (==) t1 t2 = gEq{|*|} t1 t2