gpt4 book ai didi

haskell - 使用列表理解提取列表中的每个元素

转载 作者:行者123 更新时间:2023-12-02 08:30:24 26 4
gpt4 key购买 nike

我真的是 haskell 的新手,抱歉,如果这是一个相对简单的

我有以下树

data Tree a =
Branch a [Tree a]
| Finish a
deriving (Eq, Show)

我想写一个函数 foldTree::([a] -> a) -> Tree a -> a 只用数据 (a ) 和所有调用 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 应用于每个元素?

最佳答案

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

关于haskell - 使用列表理解提取列表中的每个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27535082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com