考虑下面的树结构在Haskell:哈斯克尔树列表 - 序遍历
data Tree = Leaf Int | Node Int Tree Tree deriving Show
我怎样才能得到哈斯克尔返回序中的数据的列表?
例如给出一棵树:
Node 1 (Leaf 2) (Leaf 3)
返回类似:
preorder = [1,2,3]
考虑下面的树结构在Haskell:哈斯克尔树列表 - 序遍历
data Tree = Leaf Int | Node Int Tree Tree deriving Show
我怎样才能得到哈斯克尔返回序中的数据的列表?
例如给出一棵树:
Node 1 (Leaf 2) (Leaf 3)
返回类似:
preorder = [1,2,3]
好吧,抱歉晚答复,但我得到这个工作如下:
preorder(Leaf n) = [n]
preorder(Node n treeL treeR) = [n] ++ preorder treeL ++ preorder treeR'code'
然而,这并不正常工作对我而言仍然
preorder (Leaf n) = [n]
preorder (Node n a b) = n:(preorder a) ++ (preorder b)
使用模式匹配
preorder (Leaf n) = [n]
preorder (Node n a b) = n:(preorder a) ++ (preorder b)
你可以瞄准一个更通用的解决方案,让您的数据类型的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)
有了这个,你就可以使用每一个上Foldable
类型作品的功能,如elem
,foldr
,foldr
,sum
,minimum
,maximum
等(见here供参考)。
特别是,你正在寻找能与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
一旦你满意,不要忘记接受答案。 – 2012-03-17 10:10:11