使用列表推导提取列表中的每个元素

时间:2014-12-17 21:22:45

标签: haskell

如果这是一个相对容易的话,我对哈斯克尔很新。

我有以下树

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应用于每个元素?

1 个答案:

答案 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