如果这是一个相对容易的话,我对哈斯克尔很新。
我有以下树
data Tree a =
Branch a [Tree a]
| Finish a
deriving (Eq, Show)
我想写一个函数 foldTree ::([a] - > a) - >树a - > a 用树只替换树中的所有Finish节点(a)和所有Branch节点,调用f使得 f ::([a] - > a)
这是我的尝试
foldTree :: ([a] -> a) -> Tree a -> a
foldTree f (Finish a) = a
foldTree f (Branch a tree) = f [foldTree f tree]
现在在我的分支中,f [foldTree f tree]中的树仍然是一个列表。如何从树中提取每个元素并将f应用于每个元素?
答案 0 :(得分:6)
foldTree f (Branch a tree) = ...
这里我们有以下类型:
f :: [a] -> a
a :: a
tree :: [Tree a]
我们也有
foldTree f :: Tree a -> a
我们显然需要以某种方式提供tree
的内容,它是唯一可以消耗Tree
的函数。怎么样?好吧,让我们简单地Tree a
致电b
,然后我们需要一些功能b -> a
和[b]
列表,并为我们提供其他内容。也许hoogle knows about such a thing?事实证明它确实如此。
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