F#like Array2D中是否有List2D
我是否必须在所有2D操作中使用Array2D,然后将其转换为List2D?是否有任何方便的函数调用或库来定义和操作二维列表?简短回答:否,没有二维列表 更长的回答: 我认为创建这样一个类型是有问题的,因为它的直接实现要么在cons操作的等价物上没有O(1)复杂性,要么破坏结构平等性 列表和数组根本不是一回事。让我们回顾一些关于F#列表的事实,人们会假设F#列表是2d版本。他们:F#like Array2D中是否有List2D,list,f#,2d,List,F#,2d,我是否必须在所有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
其中-
表示左侧的节点持有对右侧的引用,|
表示上方的节点持有对下方节点的引用。就像在一维列表中一样,每个节点将包含一个完整的二维列表,即从其自身到右下角最后一个节点的矩形中所有元素的列表
由于列表应该是不可变的,但允许从子列表迭代构造,因此通过添加节点创建新列表仅在三种情况下有效:
- 新元素位于最下面的一行节点中
- 新元素位于最右边的节点列中
- 从新节点向下或向右走一步形成的元素(因此也包括二维列表)是非空的,并且能够组合成一致的二维列表
在这一点上,我想我可以理解为什么这样的东西没有进入F#core库。你想做什么?没有2D列表(至少我无法想象),但你可以将2D数组转换为列表列表(类似于锯齿数组)。我不知道你为什么要这么做。