如果这相对容易,我真的很陌生,对此我深表歉意
我有以下树
data Tree a =
Branch a [Tree a]
| Finish a
deriving (Eq, Show)
而且我想编写一个函数foldTree ::([a]-> a)-> Tree a-> a,该函数仅用数据(a)替换树中的所有Finish节点,并使用对f的调用替换所有Branch节点这样f ::([a]-> a)
这是我的尝试
foldTree :: ([a] -> a) -> Tree a -> a
foldTree f (Finish a) = a
foldTree f (Branch a tree) = f [foldTree f tree]
现在在我的Branch中,f [foldTree f tree]中的树仍然是列表。如何从树中提取每个元素并将f应用于每个元素?
foldTree f (Branch a tree) = ...
这里我们有以下几种类型:
f :: [a] -> a
a :: a
tree :: [Tree a]
我们还有
foldTree f :: Tree a -> a
我们显然需要以tree
某种方式提供内容,它是唯一可以消耗Tree
s的函数。如何?好吧,让我们Tree a
简单地调用b
,然后我们需要一些带有一个函数b -> a
和一个[b]
列表的东西,并为我们提供其他东西。也许hoogle知道这样的事吗?事实证明确实如此。
map :: (b -> a) -> [b] -> [a]
即在我们的情况下
map :: (Tree a -> a) -> [Tree a] -> [a]
所以
map (foldTree f) :: [Tree a] -> [a]
和
map (foldTree f) tree :: [a]
现在我们差不多完成了:您可以将此权限提供给f
,但请稍候...我们还可以a
!也许您想先做那个。
foldTree f (Branch a tree) = f $ a : map (foldTree f) tree
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句