diff --git a/DDF/Show.hs b/DDF/Show.hs
--- a/DDF/Show.hs
+++ b/DDF/Show.hs
@@ -7,34 +7,49 @@
 import qualified DDF.Map as Map
 import qualified DDF.VectorTF as VTF
 
-data AST = Leaf M.String | App M.String AST [AST] | Lam M.String [M.String] AST
+data Name = Prefix M.String | Infix M.String
 
-appAST (Leaf f) x = App f x []
-appAST (App f x l) r = App f x (l ++ [r])
-appAST l r = appAST (Leaf $ show l) r
+data AST = Node [M.String] Name [AST]
 
-lamAST str (Lam st l t) = Lam str (st:l) t
-lamAST str r = Lam str [] r
+appAST (Node [] n rest) x = Node [] n (rest ++ [x])
+appAST f x = Node [] (Prefix (show f)) [x]
 
+lamAST str (Node abst n rest) = Node (str:abst) n rest
+
 vars = [pre : suf | suf <- "":M.map show [0..], pre <- ['a'..'z']]
 
+leaf x = Node [] x []
+
+paren :: M.String -> M.String
+paren str = "(" ++ str ++ ")"
+
+apps :: Name -> [AST] -> M.String
+apps (Prefix n) rest = M.unwords (n:(M.map show rest))
+apps (Infix n) [] = n
+apps (Infix n) [l] = (n ++ " " ++ show l)
+apps (Infix n) [l, r] = show l ++ " " ++ n ++ " " ++ show r
+apps (Infix n) (l:r:rest) = apps (Prefix (paren (show l ++ " " ++ n ++ " " ++ show r))) rest
+
 instance M.Show AST where
-  show (Leaf f) = f
-  show (App f x l) = "(" ++ f ++ " " ++ show x ++ M.concatMap ((" " ++) . show) l ++ ")"
-  show (Lam str l t) = "(\\" ++ str ++ M.concatMap (" " ++) l ++ " -> " ++ show t ++ ")"
+  show (Node [] n []) = apps n []
+  show (Node [] n rest) = paren $ apps n rest
+  show (Node abst n rest) = paren ("\\" ++ M.unwords abst ++ " -> " ++ apps n rest)
 
 newtype Show h a = Show {runShow :: [M.String] -> M.Int -> AST}
-name = Show . M.const . M.const . Leaf
 
+cname = Show . M.const . M.const . leaf
+name = cname . Prefix
+iname = cname . Infix
+
 showAST (Show sh) = sh vars 0
 
 instance DBI Show where
-  z = Show $ M.const $ Leaf . show . M.flip (-) 1
+  z = Show $ M.const $ leaf . Prefix . show . M.flip (-) 1
   s (Show v) = Show $ \va -> v va . M.flip (-) 1
   abs (Show f) = Show $ \va x -> lamAST (show x) (f va (x + 1))
   app (Show f) (Show x) = Show $ \va h -> appAST (f va h) (x va h)
   hoas f = Show $ \(v:va) h ->
-    lamAST v (runShow (f $ Show $ M.const $ M.const $ Leaf v) va (h + 1))
+    lamAST v (runShow (f $ Show $ M.const $ M.const $ leaf $ Prefix v) va (h + 1))
 
 instance Bool Show where
   bool = name . show
@@ -108,10 +123,10 @@
   isZero = name "isZero"
 
 instance List Show where
-  nil = name "nil"
-  cons = name "cons"
+  nil = name "[]"
+  cons = iname ":"
   listMatch = name "listMatch"
-  listAppend = name "++"
+  listAppend = iname "++"
 
 instance Y Show where
   y = name "Y"
diff --git a/DeepDarkFantasy.cabal b/DeepDarkFantasy.cabal
--- a/DeepDarkFantasy.cabal
+++ b/DeepDarkFantasy.cabal
@@ -1,5 +1,5 @@
 name: DeepDarkFantasy
-version: 0.2017.8.11
+version: 0.2017.8.12
 cabal-version: 1.12
 build-type: Simple
 license: Apache
