Haskell - 将列表转换为递归数据结构

Haskell - Translate a list to a recursive data structure

我在 Haskell 教科书中发现了这个问题。给定递归数据结构:

data Foo = A Foo Foo | B Int Foo | C Int

创建函数:

createFooFromList :: [Int] -> Foo -> Foo

接受列表和 Foo,将列表应用于 Foo,returns 新的 Foo

"applying" 的含义最好用一个例子来描述。

假设我们有一个定义为 B 0 (B 1 (A (B 0 (C 1)) (B 1 (C 1))))Foo,我们必须将列表 [0,0,1,0,2,0] 应用于此 Foo。为此,只需取出给定序列中的每个整数,然后将 Foo 结构中的整数按顺序替换为序列中的这些整数。

所以对于上面的例子,我们的输出是B 0 (B 0 (A (B 1 (C 0)) (B 2 (C 0))))

到目前为止,我已经创建了一个将列表应用于 BC 结构的函数。 C 很简单,B 也很简单,因为我只是将列表的头部设置为 BInt 参数,然后递归地将列表的其余部分应用到BFoo 部分。但是我不确定如何处理 A.

这里有一个提示:

我将从编写一个辅助函数开始,它接受 [Int]Foo 参数,return 不仅是输出 Foo,还有一个额外的 [Int] 表示输入列表中尚未使用的数字。 因此,生成的输出类型可以是一对。

这里的直觉是这个辅助函数不假设输入 [Int] 列表包含 Foo 输入的正确数量的数字,但允许更多 Ints 到在场,return 是多余的。

利用这个辅助函数,你可以处理里面有两个FooA情况:你在第一个Foo上调用辅助函数,得到多余的Ints,然后你将这些用于第二个 Foo,return 新的多余 Ints。

(更高级的方法是使用 State [Int] monad,但上面的基本方法应该没问题。)