Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
F#like Array2D中是否有List2D_List_F#_2d - Fatal编程技术网

F#like Array2D中是否有List2D

F#like Array2D中是否有List2D,list,f#,2d,List,F#,2d,我是否必须在所有2D操作中使用Array2D,然后将其转换为List2D?是否有任何方便的函数调用或库来定义和操作二维列表?简短回答:否,没有二维列表 更长的回答: 我认为创建这样一个类型是有问题的,因为它的直接实现要么在cons操作的等价物上没有O(1)复杂性,要么破坏结构平等性 列表和数组根本不是一回事。让我们回顾一些关于F#列表的事实,人们会假设F#列表是2d版本。他们: 它们是不变的 支架结构比较 可以通过预先添加元素以迭代方式构建 二维F#列表的等价物可以被视为类似晶格结构中的矩形

我是否必须在所有2D操作中使用Array2D,然后将其转换为List2D?是否有任何方便的函数调用或库来定义和操作二维列表?

简短回答:否,没有二维列表

更长的回答:

我认为创建这样一个类型是有问题的,因为它的直接实现要么在cons操作的等价物上没有O(1)复杂性,要么破坏结构平等性

列表和数组根本不是一回事。让我们回顾一些关于F#列表的事实,人们会假设F#列表是2d版本。他们:

  • 它们是不变的
  • 支架结构比较
  • 可以通过预先添加元素以迭代方式构建
二维F#列表的等价物可以被视为类似晶格结构中的矩形,如下所示:

    N: Node           N-N-0
    0: None           | |
                    N-N-N-0
                    | | |
                N-N-N-N-N-0
                | | | | |
                0 0 0 0 0
其中
-
表示左侧的节点持有对右侧的引用,
|
表示上方的节点持有对下方节点的引用。就像在一维列表中一样,每个节点将包含一个完整的二维列表,即从其自身到右下角最后一个节点的矩形中所有元素的列表

由于列表应该是不可变的,但允许从子列表迭代构造,因此通过添加节点创建新列表仅在三种情况下有效:

  • 新元素位于最下面的一行节点中
  • 新元素位于最右边的节点列中
  • 从新节点向下或向右走一步形成的元素(因此也包括二维列表)是非空的,并且能够组合成一致的二维列表
这就是麻烦来了。在一个结构比较的世界里,你如何判断这两个邻居建立在相同的子列表上?您可以通过右下和右下路径从新节点沿对角线向下走一步,查看是否在同一个元素处结束。如果结果不同(由于无效参数而失败)或引用相同(新的2d列表有效),这是很好的,但如果它们的内容相同,但它们的标识不同,那该怎么办?换句话说:它们是不同的对象,但可能是等价的?现在,我们不得不将整个过程进行比较,否则我们可能最终会构建一个完全不是二维的疯狂图形

这需要比较整个子列表,即从新插入的节点到最右下角节点的一步对角线节点的矩形。这并不实际;像这样构建一个由n个元素组成的二维列表将有O(n^2)–除非有某种形式的优化,例如跟踪所有节点并为等效节点提供唯一标识


在这一点上,我想我可以理解为什么这样的东西没有进入F#core库。

你想做什么?没有2D列表(至少我无法想象),但你可以将2D数组转换为列表列表(类似于锯齿数组)。我不知道你为什么要这么做。