SML是否支持嵌套列表?

时间:2014-10-15 09:05:49

标签: list scheme sml sml-mode

嵌套列表可以存在于Scheme中,但在SML中使用嵌套列表是否合法?或者我们只能在SML中使用简单列表?

如果合法,

1)如何检查两个输入列表是否具有相同的列表结构。算法列表中的原子不相等。

2)无论输入列表的深度如何,如何删除嵌套列表中等于输入值的所有原子: a 。应该使用原始列表而不是创建新列表。

2 个答案:

答案 0 :(得分:3)

在标准ML中嵌套列表没有问题。举个例子:

val foo = [ [1, 2, 3], [4, 5], [6] ]

int list list的示例,即整数列表的列表。

至于你的其他问题。

1

如果使用相同的结构,则表示子列表是否包含相同数量的元素,即您想要

val bar = [ [34, 4, 6], [2, 78], [22] ]
val baz = [ [1], [4, 6, 2], [3, 6] ]

val cmp_foo_bar = structureEq (foo, bar) (* gives true, since the lengths of the sublists match up *)
val cmp_foo_baz = structureEq (foo, baz) (* gives false, since they don't *)

然后你可以简单地在列表上创建一个递归函数,依次比较每个子列表的长度。

注意,如果列表不止一次嵌套,那么每个级别都需要一个函数。 (即'a list list个,'a list list list个,等等。

2

你无法创建一个"然而深入输入列表的功能"对列表中的元素执行某些操作。类型系统不允许你这样做。这类似于您无法制作以下列表的方式:

val illegal_list = [ [1, 2], [ [1, 4], [2, 3] ] ]

这是因为只允许列表包含一种类型的元素,因此如果您有'a list list,则列表中的每个元素必须'a list 。你不能直接拥有'a

您必须确定列表的嵌套方式,并制作特定于该深度的函数。

答案 1 :(得分:2)

SML中的嵌套列表没有问题,例如[[1, 2], [3, 4]]工作正常。

然而,我怀疑你实际上意味着更普遍的东西,即嵌套和#34;列表"以异类方式:[[1, [3]], 2]。这在SML中是不合法的。但是,这是因为这样的事情实际上不是一个列表,它是一棵树。

您也可以轻松定义树,但是您需要比列表更一般的类型定义:

datatype 'a tree = L of 'a | T of 'a tree list

然后T[T[L 1, T[L 3]], L 2]代表"列表"以上。用于计算这种树的深度(或高度)的函数看起来像

fun depth (L _)  = 0
  | depth (T ts) = 1 + max (List.map depth ts)

其中max需要以明显的方式定义。