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))))
到目前为止,我已经创建了一个将列表应用于 B
和 C
结构的函数。 C
很简单,B
也很简单,因为我只是将列表的头部设置为 B
的 Int
参数,然后递归地将列表的其余部分应用到B
的 Foo
部分。但是我不确定如何处理 A
.
这里有一个提示:
我将从编写一个辅助函数开始,它接受 [Int]
和 Foo
参数,return 不仅是输出 Foo
,还有一个额外的 [Int]
表示输入列表中尚未使用的数字。
因此,生成的输出类型可以是一对。
这里的直觉是这个辅助函数不假设输入 [Int]
列表包含 Foo
输入的正确数量的数字,但允许更多 Int
s 到在场,return 是多余的。
利用这个辅助函数,你可以处理里面有两个Foo
的A
情况:你在第一个Foo
上调用辅助函数,得到多余的Int
s,然后你将这些用于第二个 Foo
,return 新的多余 Int
s。
(更高级的方法是使用 State [Int]
monad,但上面的基本方法应该没问题。)
我在 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))))
到目前为止,我已经创建了一个将列表应用于 B
和 C
结构的函数。 C
很简单,B
也很简单,因为我只是将列表的头部设置为 B
的 Int
参数,然后递归地将列表的其余部分应用到B
的 Foo
部分。但是我不确定如何处理 A
.
这里有一个提示:
我将从编写一个辅助函数开始,它接受 [Int]
和 Foo
参数,return 不仅是输出 Foo
,还有一个额外的 [Int]
表示输入列表中尚未使用的数字。
因此,生成的输出类型可以是一对。
这里的直觉是这个辅助函数不假设输入 [Int]
列表包含 Foo
输入的正确数量的数字,但允许更多 Int
s 到在场,return 是多余的。
利用这个辅助函数,你可以处理里面有两个Foo
的A
情况:你在第一个Foo
上调用辅助函数,得到多余的Int
s,然后你将这些用于第二个 Foo
,return 新的多余 Int
s。
(更高级的方法是使用 State [Int]
monad,但上面的基本方法应该没问题。)