【问题标题】:Does SML supports the nested list?SML 是否支持嵌套列表?
【发布时间】:2014-10-15 09:05:49
【问题描述】:

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

如果合法,

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

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

【问题讨论】:

    标签: list scheme sml sml-mode


    【解决方案1】:

    在标准 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 lists 一个,'a list list lists 一个,等等。

    2

    你不能创建一个“不管输入列表有多深”的函数对列表中的元素做一些事情。类型系统不会让你这样做。这类似于您无法列出以下列表:

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

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

    您必须确定列表的嵌套程度,并创建一个特定于该深度的函数。

    【讨论】:

    • 在P1中,如何在列表上编写递归函数来比较每个子列表的长度,因为就像你的例子一样,bar的子列表的长度是(3,2,1),而baz是(1,3,2),如何存储(3,2,1)和(1,3,2)并进行比较?更何况,如果嵌套了不止一次,却因为不知道输入列表的结构,不知道列表的层级怎么办?
    • 在P2中,如果我们不能计算输入列表的深度,是不是意味着根据输入列表的类型,我们应该编写不同的代码来实现它(每个深度应该有一个功能)?以及如何解决这个问题:使用两个参数,一个原子和一个列表,它返回一个与参数列表相同的列表,除了所有出现(无论多深)的给定原子都被删除。返回的列表不能包含任何东西来代替已删除的原子。
    【解决方案2】:

    在 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 需要以明显的方式定义。

    【讨论】:

    • 是的,我明白嵌套列表是什么意思~但是如何解决 P1 和 P2?如果它是一个简单的列表,很容易实现问题,但我不知道如何处理嵌套列表。你能不能给我一个解决方案,以便我可以从中学习并完成另一个解决方案~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2019-11-07
    • 2016-11-06
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多