data Op
valid :: Op -> Int -> Int -> Bool
apply :: Op -> Int -> Int -> Int
data Expr = Val Int | App Op Expr Expr
values :: Expr -> [Int]
eval :: Expr -> [Int]