你可以尝试采用更通用的解决方案,将你的数据类型实例化为
Foldable
。在
hackage上有一个非常相似的示例,但它实现了后序访问。如果你想支持前序访问,你需要编写类似于以下内容的代码:
import qualified Data.Foldable as F
data Tree a = Leaf a | Node a (Tree a) (Tree a) deriving Show
instance F.Foldable Tree where
foldr f z (Leaf x) = f x z
foldr f z (Node k l r) = f k (F.foldr f (F.foldr f z r) l)
通过这个方法,您可以使用所有适用于“可折叠”类型的函数,例如
elem
,
foldr
,
foldr
,
sum
,
minimum
,
maximum
等等(请参见
此处)。
特别是,您可以使用
toList
来获得您正在查找的列表。以下是一些通过定义该实例而编写的示例:
*Main> let t = Node 1 (Node 2 (Leaf 3) (Leaf 4)) (Leaf 5)
*Main> F.toList t
[1,2,3,4,5]
*Main> F.foldl (\a x -> a ++ [x]) [] t
[1,2,3,4,5]
*Main> F.foldr (\x a -> a ++ [x]) [] t
[5,4,3,2,1]
*Main> F.sum t
15
*Main> F.elem 3 t
True
*Main> F.elem 12 t
False