【发布时间】:2018-09-21 20:45:09
【问题描述】:
尝试使用给定的折叠函数将树展平为列表。
treeFold :: (b -> a -> b -> b) -> b -> Tree a -> b
treeFold _ b Leaf = b
treeFold f b (Node lt x rt) = f (treeFold f b lt) x (treeFold f b rt)
到目前为止,这是我尝试过的:
treeToList :: Tree a -> [a]
treeToList = treeFold (\xs x ys -> xs ++ x : ys) (\x -> [x])
出于某种原因,我不知道该怎么做? 感觉好像有一些关于 Haskell 的事情我还没有完全进入我的脑海。任何帮助以及如何解决它都会受到赞赏。 谢谢!
编辑:
我意识到我在这里使用的类型签名几乎是荒谬的。在 treeFold 的类型签名中,根据我的想法,第二个参数 (b) 可能是一个列表,因为它在这种情况下以某种方式充当累加器。这将使第三个参数(树 a)成为等式左侧参数的某个版本。函数中的两个参数必须是节点中的左右子树。第三个参数只是节点的值。在函数中,我需要按通常的顺序组合左树、右树和值,但我尝试的所有不同变体都有一些问题
【问题讨论】:
-
(\x -> [x])在这里做什么?
标签: haskell functional-programming binary-tree