嵌套列表可以存在于Scheme中,但在SML中使用嵌套列表是否合法?或者我们只能在SML中使用简单列表?
如果合法,
1)如何检查两个输入列表是否具有相同的列表结构。算法列表中的原子不相等。
2)无论输入列表的深度如何,如何删除嵌套列表中等于输入值的所有原子: a 。应该使用原始列表而不是创建新列表。
答案 0 :(得分:3)
在标准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 list
个,'a list list list
个,等等。
你无法创建一个"然而深入输入列表的功能"对列表中的元素执行某些操作。类型系统不允许你这样做。这类似于您无法制作以下列表的方式:
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
需要以明显的方式定义。