【发布时间】:2014-10-15 09:05:49
【问题描述】:
Scheme 中可以存在嵌套列表,但是在 SML 中使用嵌套列表是否合法?或者我们只能在 SML 中使用简单列表?
如果合法,
1) 如何检查两个输入列表是否具有相同的列表结构。算法列表中的原子不相等。
2) 无论输入列表的深度如何,如何删除嵌套列表中等于输入值的所有原子:a。应该使用原始列表而不是创建新列表。
【问题讨论】:
Scheme 中可以存在嵌套列表,但是在 SML 中使用嵌套列表是否合法?或者我们只能在 SML 中使用简单列表?
如果合法,
1) 如何检查两个输入列表是否具有相同的列表结构。算法列表中的原子不相等。
2) 无论输入列表的深度如何,如何删除嵌套列表中等于输入值的所有原子:a。应该使用原始列表而不是创建新列表。
【问题讨论】:
在标准 ML 中嵌套列表没有问题。举个例子:
val foo = [ [1, 2, 3], [4, 5], [6] ]
是int list list 的示例,即整数列表的列表。
至于您的其他问题。
如果使用相同的结构,您的意思是子列表是否包含相同数量的元素,即您想要
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 lists 一个,'a list list lists 一个,等等。
你不能创建一个“不管输入列表有多深”的函数对列表中的元素做一些事情。类型系统不会让你这样做。这类似于您无法列出以下列表:
val illegal_list = [ [1, 2], [ [1, 4], [2, 3] ] ]
这是因为列表只允许包含一种类型的元素,因此如果您有 'a list list,则列表中的每个元素必须是 'a list。你不能直接拥有'as。
您必须确定列表的嵌套程度,并创建一个特定于该深度的函数。
【讨论】:
在 SML 中嵌套列表没有问题,例如[[1, 2], [3, 4]] 工作正常。
但是,我怀疑您实际上是指更笼统的东西,即以异构方式嵌套“列表”的能力:[[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 需要以明显的方式定义。
【讨论】: