微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

嵌套列表中的SML操作元素

如何解决嵌套列表中的SML操作元素

我希望能够处理嵌套列表(例如[[1,2,3],[4,5],[6,7]]

)中的项目
fun f (nil,_) = nil 

|   f((a :: b),rest) = a;

我上面写的只是为了能够访问第一个列表中的第一个元素,但是它给出了这个错误

stdIn:29.1-29.28 Error: operator and operand do not agree [tycon mismatch]

operator domain: 'Z list list * 'Y

operand:         'X[INT] list list

我尝试了其他几种方法,但是我只是不明白出了什么问题。

解决方法

访问第一个列表中的第一个元素

因为没有问题,所以很难回答。但这有点像一个挣扎点。在不知道确切要实现什么的情况下,以下是对列表列表进行操作的一些函数示例:


fun firsts [] = []
  | firsts ([]::rest) = firsts rest
  | firsts ((x::xs)::rest) = x :: firsts rest

尝试一下:

- firsts [[1,2,3],[4,5],[6,7]];
> val it = [1,4,6] : int list

它的工作方式是在列表的空列表上不再有第一个元素,因此返回第一个元素的空列表; first [] = []。在这些内部列表中的第一个为空的列表中,此列表没有第一个元素,因此找到了其余列表的第一个元素first ([]::rest) = firsts rest。最后,对于第一个列表为非空的列表的非空列表,该列表的第一个元素x是最终结果的一部分。

您可以将此函数编写为:

fun firsts rest = List.map head rest

但是,由于head在空列表上崩溃(该函数是部分函数),因此就像省略了中间模式。确认head是局部的,并提供了更安全的“无结果”值,您可以在没有错误的情况下获得非常相似的结果:

fun safeHead [] = NONE
  | safeHead (x::xs) = SOME x

fun firsts rest = List.mapPartial safeHead rest

尝试一下:

- firsts [[1,[],7,8],[9]];
> val it = [1,6,9] : int list

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。