data E = Sevens Int | E :+: E | E :-: E | E :*: E | E :/: E | Neg E eval :: E -> Double eval (Sevens k) = (iterate (\x -> 14*x + 7) 0) !! k eval (a :+: b) = (eval a) + (eval b) eval (a :-: b) = (eval a) - (eval b) eval (a :*: b) = (eval a) * (eval b) eval (a :/: b) = (eval a) / (eval b) eval (Neg a) = -(eval a) showE :: Int -> E -> String showE pe = s pe where s pe (Sevens k) = take k (repeat '7') s pe (a:+:b) = helper pe 1 a b "+" s pe (a:-:b) = helper pe 2 a b "-" s pe (a:*:b) = helper pe 3 a b "*" s pe (a:/:b) = helper pe 4 a b "/" s pe (Neg a) = "-" ++ (s 2 a) helper pe p a b op | p > pe = (s p a) ++ op ++ (s p b) | otherwise = "(" ++ (s p a) ++ op ++ (s p b) ++ ")" instance Show E where show = showE 0 anyE :: Int -> [E] anyE n = let xs = f n in xs ++ map Neg xs where f n = (Sevens n) : do k <- [1..n-1] a <- f k b <- f (n-k) op <- if k <= n-k then [ (:+:), (:-:), (:*:), (:/:) ] else [ (:-:), (:/:) ] return (op a b) main = mapM_ print (filter check (anyE 5)) where check e = (abs ((eval e) - 14*14)) < 1e-7