Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 处理任意深嵌套列表_List_Haskell_Recursion - Fatal编程技术网

List 处理任意深嵌套列表

List 处理任意深嵌套列表,list,haskell,recursion,List,Haskell,Recursion,我正在编写一段代码,通过吃掉包含输入元素的列表来生成大量结果。说[i1,i2,i3,i4] 生成结果的函数将以所有可能的方式组合前两种:o1、o2和o3,并用此计算的结果替换输入: [o1,i3,i4],[o2,i3,i4],[o3,i3,i4]] 从这里开始,我希望依靠递归生成一个单例o的列表,这些单例o是组合输入的结果,但我在处理任意嵌套列表时遇到了一些问题,很可能是因为我正试图将输出映射回这种函数: tides :: [a] -> [a] tides (i1:i2:is) = ma

我正在编写一段代码,通过吃掉包含输入元素的列表来生成大量结果。说[i1,i2,i3,i4]

生成结果的函数将以所有可能的方式组合前两种:o1、o2和o3,并用此计算的结果替换输入:

[o1,i3,i4],[o2,i3,i4],[o3,i3,i4]]

从这里开始,我希望依靠递归生成一个单例o的列表,这些单例o是组合输入的结果,但我在处理任意嵌套列表时遇到了一些问题,很可能是因为我正试图将输出映射回这种函数:

tides :: [a] -> [a]
tides (i1:i2:is) =  map tides ((makeResult i1 i2):is) 
tides [] = []
--其中makeResult生成所述输出

这是行不通的,我相信我不会找到一个这样的工作函数。描述这种递归的正确方法是什么?

列表类型(
[]
)不进行任意嵌套,它只在其他类型上引入了一个级别的“列表”

[1,2,3]            :: [Int]
[(), (), ()]       :: [()]
[[1,2,3], [4,5,6]] :: [[Int]]
这意味着嵌套列表集中的每个子树都必须具有相同的深度。此外,这个确切的深度必须用类型表示(静态地!),因此您必须在编译时知道它

如果你习惯了动态列表,那么这听起来很可笑。然而,真正发生的是,Haskell列表比其他地方使用的列表更具限制性——这些列表实际上是玫瑰树:

data Rose a = Rose [Rose a] | Leaf a
rosea
类型的值要么是单例(包装在
Leaf
中)要么是
rosea
的列表,每一个都是单例或列表的另一层,区别仅在运行时可用

(((1 (2 3)) 
  (4 5) 6) 
 (1 2))

Rose [ Rose [Leaf 1, Rose [Leaf 2, Leaf 3]]
     , Rose [Rose [Leaf 4, Leaf 5], Leaf 6]
     , Rose [Leaf 1, Leaf 2]]
列表类型(
[]
)不进行任意嵌套,它只在其他类型上引入了一个级别的“列表”

[1,2,3]            :: [Int]
[(), (), ()]       :: [()]
[[1,2,3], [4,5,6]] :: [[Int]]
这意味着嵌套列表集中的每个子树都必须具有相同的深度。此外,这个确切的深度必须用类型表示(静态地!),因此您必须在编译时知道它

如果你习惯了动态列表,那么这听起来很可笑。然而,真正发生的是,Haskell列表比其他地方使用的列表更具限制性——这些列表实际上是玫瑰树:

data Rose a = Rose [Rose a] | Leaf a
rosea
类型的值要么是单例(包装在
Leaf
中)要么是
rosea
的列表,每一个都是单例或列表的另一层,区别仅在运行时可用

(((1 (2 3)) 
  (4 5) 6) 
 (1 2))

Rose [ Rose [Leaf 1, Rose [Leaf 2, Leaf 3]]
     , Rose [Rose [Leaf 4, Leaf 5], Leaf 6]
     , Rose [Leaf 1, Leaf 2]]

您不能随意在Haskell中嵌套列表,您必须编写自己的数据结构来处理它。我建议使用类似于
数据嵌套列表a=Single[a]| Many[NestedList a]
的方法。在此之后,您必须编写所需的所有函数。不过,您可能已经在Hackage上找到了一个实现。你确定你想要任意嵌套的列表,而不仅仅是,比如说?你能再给我们一些关于你想做什么的细节吗?我正在建立一个自下而上的Gentzen风格的演绎证明程序。我试图从公理到结论,我必须在我的部分演绎(o)中添加一个公理(I在上面^)。要做到这一点,我必须跟踪我要介绍的公理,因此我认为通过列表操作推断序列是一种方法。你不能随意在Haskell中嵌套列表,你必须编写自己的数据结构来处理它。我建议使用类似于
数据嵌套列表a=Single[a]| Many[NestedList a]
的方法。在此之后,您必须编写所需的所有函数。不过,您可能已经在Hackage上找到了一个实现。你确定你想要任意嵌套的列表,而不仅仅是,比如说?你能再给我们一些关于你想做什么的细节吗?我正在建立一个自下而上的Gentzen风格的演绎证明程序。我试图从公理到结论,我必须在我的部分演绎(o)中添加一个公理(I在上面^)。要做到这一点,我必须跟踪哪些公理留给我来介绍,所以我认为通过列表操作来推断序列是一种可行的方法。