我正在尝试编写一个函数来检查它的元素是否交替。
此类列表的示例为:[1,2,1,2,1,2]
到目前为止我的尝试:
fun isAlternating(lst) =
case lst of
[] => true
| x::y::tail => if y <> x
then isAlternating(y::tail)
else false
当我尝试测试该方法时,会引发以下异常:
uncaught exception Match [nonexhaustive match failure]
我似乎错过了一个模式,但我不知道哪一个。有人可以帮我这个吗?
答案 0 :(得分:2)
您在模式匹配中缺少单元素列表。这应该工作。对于one-list元素,您应该按定义返回true
。
fun isAlternating(lst) =
case lst of
[] => true
| x::nil => true
| x::y::tail => if y <> x
then isAlternating(y::tail)
else false;
答案 1 :(得分:0)
有点迂腐,请注意根据您的示例以及您的函数名称,您要检查列表是否包含交替元素(即,只有两个轮流的不同元素在他们出现在列表中)。但这并不是你的功能(或@Diego Sevilla就此而言)的计算方式。您只是检查列表中的连续元素是否相同。也许你真的想要这样的东西:
fun is_alternating (x::(xs as _::y::_)) =
if x = y then is_alternating xs else false
| is_alternating _ = true;
请注意模式的顺序如何重要:要么我们至少有3个元素(模式:x::_::y_::
),要么(模式:_
)我们匹配其他所有元素(即空列表,单例列表)和两元素列表)。另请注意使用x as pattern
如何避免重建已存在的结构。
至于功能在做什么: