Вот мой код на Haskell'е:
infixl 6 :$:
data ExE = ExData Integer | ExE :$: ExE deriving (Show, Eq)
simplify :: ExE -> ExE
simplify ((a1 :$: a2) :$: a3) = simplify a1 :$: simplify a2 :$: simplify a3
simplify (a1 :$: (a2 :$: a3)) = simplify a1 :$: simplify a2 :$: simplify a3
simplify (a1 :$: a2) = simplify a1 :$: simplify a2
simplify a = a
Вот результат его работы:
*ExTesting> simplify $ (ExData 1 :$: ExData 2) :$: ExData 3
(ExData 1 :$: ExData 2) :$: ExData 3
*ExTesting> simplify $ ExData 1 :$: (ExData 2 :$: ExData 3)
(ExData 1 :$: ExData 2) :$: ExData 3
Тогда как надо было получить это:
*ExTesting> simplify $ (ExData 1 :$: ExData 2) :$: ExData 3
ExData 1 :$: ExData 2 :$: ExData 3
*ExTesting> simplify $ ExData 1 :$: (ExData 2 :$: ExData 3)
ExData 1 :$: ExData 2 :$: ExData 3
Как мне избавиться от этих лишних скобок в результате?