consName{|Bool|} b = toString b
consName{|Char|} c = toString c
consName{|String|} s = s
+consName{|[]|} _ _ = "[]"
consName{|(->)|} f g x = g (x undef)
generic consIndex a :: a -> Int
consIndex{|Bool|} b = if b 1 0
consIndex{|Char|} c = toInt c
consIndex{|String|} _ = 0
+consIndex{|[]|} _ _ = 0
generic conses a :: [a]
conses{|CONS|} f = [CONS (hd f)]