给定以下简单的 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 的经验让我相信,如果我两次写类似的东西,我可能做错了。
有什么方法可以编写一个可以采用纯函数或单子函数的 inOrder 函数?