List 要列出的Haskell树

List 要列出的Haskell树,list,haskell,tree,List,Haskell,Tree,哈斯克尔,我们开始了!好的,下面是一个当前使用的代码示例: data Tree a = Node (Tree a) (Tree a) | Leaf a | Empty deriving (Show) main = do let my_tree = Node (Node (Leaf [1,2,4,9]) (Leaf [3,5,5,8,5])) (Leaf [2,7,5,5,2]) cc my_tree bb my_tree aa my_tree cc my_tree print("Don

哈斯克尔,我们开始了!好的,下面是一个当前使用的代码示例:

data Tree a = Node (Tree a) (Tree a) | Leaf a | Empty  deriving (Show)
main = do
let my_tree = Node (Node (Leaf [1,2,4,9]) (Leaf [3,5,5,8,5])) (Leaf [2,7,5,5,2])
cc my_tree
bb my_tree  
aa my_tree
cc my_tree  
print("Done")
只需创建一个包含Int列表的树,需要3个函数才能工作aa、bb、cc:

cc-只输出一棵树
bb-每个值的广告+2
aa-输出每个值的列表,如:[长度、最小值、最大值]

现在有一个代码几乎完美地完成了这一切,我把它放在了代码板中(如果你想问我):??????? 现在您可以看到aa的最后一个输出也是一个树
这可能是一个快速解决方案,但我无法理解-因此aa将输出的不是一棵树,而是以下内容的列表[]:

[length param,minimum param,maximum param]
换句话说,是否有人知道如何将其输出为列表,而不是在树中??
因此,在输出中,而不是:

Node (Node (Leaf [4,1,9]) (Leaf [6,0,8])) (Leaf [5,2,7])
会是

[[4,1,9],[6,0,8],[5,2,7]]
我认为这里有些东西需要修改:

fmap3 ff (Node l r) = Node (fmap2 ff l) (fmap2 ff r)
fmap3 ff (Leaf x) = Leaf (ff x) 

任何人???

您正在尝试执行reduce操作:将树转换为单个值(三倍:长度、最大值、最小值)。这不能使用映射函数来完成,因为根据定义映射总是将树转换为树

典型的reduce算法使用一个函数将两个简化的结果“合并”在一起,并递归地合并树中任意位置获得的结果。所以,你会有这样的事情:

reduce ff (Node l r) = ff (reduce ff l) (reduce ff r)
reduce ff (Leaf x)   = x
完成此操作后,可以使用map函数将(任意)树转换为要缩减的值树,并应用reduce函数

cc tree = [ reduce (+)   (fmap2 length tree) , 
            reduce (min) (fmap2 minimum tree) ,
            reduce (max) (fmap2 maximum tree) ]
编辑:我回答时,您已更改了问题。您可以使用上面的缩减函数和列表连接函数
++
来实现这一点,但是列表连接在性能方面不是很吸引人

通过使用带累加器参数的遍历,有一种惯用方法将树转换为列表:

traverse init (Node l r) = traverse (traverse init r) l
traverse init (Leaf x)   = x : init

cc tree = traverse [] (fmap2 h tree)

您正在尝试执行reduce操作:将树转换为单个值(三倍:长度、最大值、最小值)。这不能使用映射函数来完成,因为根据定义映射总是将树转换为树

典型的reduce算法使用一个函数将两个简化的结果“合并”在一起,并递归地合并树中任意位置获得的结果。所以,你会有这样的事情:

reduce ff (Node l r) = ff (reduce ff l) (reduce ff r)
reduce ff (Leaf x)   = x
完成此操作后,可以使用map函数将(任意)树转换为要缩减的值树,并应用reduce函数

cc tree = [ reduce (+)   (fmap2 length tree) , 
            reduce (min) (fmap2 minimum tree) ,
            reduce (max) (fmap2 maximum tree) ]
编辑:我回答时,您已更改了问题。您可以使用上面的缩减函数和列表连接函数
++
来实现这一点,但是列表连接在性能方面不是很吸引人

通过使用带累加器参数的遍历,有一种惯用方法将树转换为列表:

traverse init (Node l r) = traverse (traverse init r) l
traverse init (Leaf x)   = x : init

cc tree = traverse [] (fmap2 h tree)
这个有效

data Tree a = EmptyTree | Node a (Tree a) (Tree a)

treeToList :: (Ord a) => Tree a -> [a]   
treeToList EmptyTree = []         
treeToList (Node root left right) = treeToList left ++ [root] ++ treeToList right 
这个有效

data Tree a = EmptyTree | Node a (Tree a) (Tree a)

treeToList :: (Ord a) => Tree a -> [a]   
treeToList EmptyTree = []         
treeToList (Node root left right) = treeToList left ++ [root] ++ treeToList right 

啊,我明白了。。好吧,我现在就试试!现在我只尝试了第一部分:似乎它输出了所有树的最大、最小、长度,现在将尝试第二部分完美!现在,为了弄清楚如何以第三个参数(最大值)的升序方式对这个结果进行排序,我看到了。。好吧,我现在就试试!现在我只尝试了第一部分:似乎它输出了所有树的最大、最小、长度,现在将尝试第二部分完美!现在,要了解如何以第三个参数(最大值)的升序方式对该结果进行排序