列表是否包含交替元素

时间:2014-02-03 18:19:50

标签: sml smlnj

我正在尝试编写一个函数来检查它的元素是否交替。

此类列表的示例为:[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]

我似乎错过了一个模式,但我不知道哪一个。有人可以帮我这个吗?

2 个答案:

答案 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如何避免重建已存在的结构。

至于功能在做什么:

  • 如果至少有3个元素,请检查第一个和第三个是否相同,并递归重复检查输入列表的尾部。
  • 否则,该列表最多包含两个元素,因此 交替。