Учитывая следующее простое определение BST:
data Tree x = Empty | Leaf x | Node x (Tree x) (Tree x)
deriving (Show, Eq)
inOrder :: Tree x -> [x]
inOrder Empty = []
inOrder (Leaf x) = [x]
inOrder (Node root left right) = inOrder left ++ [root] ++ inOrder right
Я хотел бы написать функцию в порядке, которая может иметь побочные эффекты. Я достиг этого с:
inOrderM :: (Show x, Monad m) => (x -> m a) -> Tree x -> m ()
inOrderM f (Empty) = return ()
inOrderM f (Leaf y) = f y >> return ()
inOrderM f (Node root left right) = inOrderM f left >> f root >> inOrderM f right
-- print tree in order to stdout
inOrderM print tree
Это прекрасно работает, но кажется повторяющимся - та же логика уже присутствует в inOrder , и мой опыт работы с Haskell заставляет меня поверить, что я, вероятно, делаю что-то не так, если пишу похожее вещь дважды.
Можно ли как-нибудь написать одну функцию вOrder, которая может принимать чистые или монадические функции?