如何查看相邻元素是否在列表中重复?(SML)



SML对我来说是一门很有挑战性的语言。我正试图找到一种方法来筛选一个未确定的列表,并根据列表上相邻的两个元素是否具有相同的值来返回布尔值。下面是我尝试并认为接近正确的内容。

fun repeatE nil = false
| repeatE (first::last) = first = last orelse repeatsE(last);

显然,这会导致一个错误。我的答案基于这段代码,它告诉我一个值是否是列表中的一个元素。

fun member (e, nil) = false
| member (e, first::last) = e = first orelse member(e, last);

为什么第一个不起作用,而最后一个起作用?它告诉我运算符和操作数不一致,也许我头脑很重,但我不太明白为什么它们不一致?

提前谢谢!

first=last尝试将列表的第一个元素与该列表的尾部进行比较,并且只能比较相同(可比较(类型的内容。

工作代码之所以有效,是因为它不尝试将列表元素与整个列表进行比较。

您需要将第一个元素与第二个元素进行比较,并且需要处理singleton列表的情况。

类似这样的东西:

fun repeats nil = false
| repeats (first::rest) = case rest of 
(x::xs) => first = x orelse repeats rest
|   _ => false

fun repeats nil = false
| repeats (first::rest) = not (null rest)
andalso (first = (hd rest) orelse repeats rest)

实际上可以使用as来稍微清理@molbdnilo的答案。

问问自己:一个空列表是false,但一个只有一个元素的列表也是,对吧?

fun repeats([])  = false
| repeats([_]) = false

现在,我们需要匹配一个至少有两个元素的列表,并对它们进行比较。如果它们不相等,我们将检查所有,但第一个元素。

fun repeats([])  = false
| repeats([_]) = false
| repeats(a::b::tail) =   
a = b orelse repeats(b::tail)

但是我们不需要使用b::tail

fun repeats([])  = false
| repeats([_]) = false
| repeats(a::(tail as b::_)) =   
a = b orelse repeats(tail)

如果我们愿意的话,我们可以认识到空列表和单元素列表只是";其他";当最后一个模式不匹配时,我们将重写它以反映这一点。

fun repeats(a::(tail as b::_)) = 
a = b orelse repeats(tail)
| repeats(_) = false

最新更新