嵌套列表中的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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...