--- /dev/null
+{-# LANGUAGE MultiParamTypeClasses #-}
+module Language where
+
+import Serialise
+
+newtype Main a = Main {unmain :: a}
+data In a b = a :- b
+infix 1 :-
+
+class Expression v where
+ lit :: (Serialise a, Show a) => a -> v a
+ (+.) :: Num a => v a -> v a -> v a
+ (-.) :: Num a => v a -> v a -> v a
+ (/.) :: Fractional a => v a -> v a -> v a
+ (*.) :: Num a => v a -> v a -> v a
+ (^.) :: Num a => v a -> v a -> v a
+ neg :: Num a => v a -> v a
+ (&.) :: v Bool -> v Bool -> v Bool
+ (|.) :: v Bool -> v Bool -> v Bool
+ not :: v Bool -> v Bool
+ (==.) :: Eq a => v a -> v a -> v Bool
+ (/=.) :: Eq a => v a -> v a -> v Bool
+ (<.) :: Ord a => v a -> v a -> v Bool
+ (>.) :: Ord a => v a -> v a -> v Bool
+ (<=.) :: Ord a => v a -> v a -> v Bool
+ (>=.) :: Ord a => v a -> v a -> v Bool
+ if' :: v Bool -> v a -> v a -> v a
+
+class Function a v where
+ fun :: ( (a -> v s) -> In (a -> v s) (Main (v u)) ) -> Main (v u)
+
+infixr 2 |.
+infixr 3 &.
+infix 4 ==., /=., <., >., <=., >=.
+infixl 6 +., -.
+infixl 7 *., /.
+infixl 8 ^.