List Scala中列表的模式匹配元素

List Scala中列表的模式匹配元素,list,scala,pattern-matching,List,Scala,Pattern Matching,我正试图按如下方式进行: def contains(x: Int, l: List[Int]) = l match { // this is just l.contains(x) case _ :: x :: _ => true case _ => false } 不幸的是,它不起作用 scala> contains(0, List(1, 2, 3)) res21: Boolean = true scala> contains(1, List(1, 2, 3)

我正试图按如下方式进行:

def contains(x: Int, l: List[Int]) = l match { // this is just l.contains(x)
  case _ :: x :: _ => true
  case _ => false
}
不幸的是,它不起作用

scala> contains(0, List(1, 2, 3))
res21: Boolean = true

scala> contains(1, List(1, 2, 3))
res22: Boolean = true

scala> contains(3, List(1, 2, 3))
res23: Boolean = true

您能解释一下原因吗?

第一个案例匹配非空列表中的任何项目,注意

scala> contains(123, List(1, 2, 3))
res1: Boolean = true

scala> contains(123, List())
res2: Boolean = false

与列表的头项匹配的递归方法可能会起作用。

第一种情况与非空列表中的任何项匹配,请注意

scala> contains(123, List(1, 2, 3))
res1: Boolean = true

scala> contains(123, List())
res2: Boolean = false

与列表的头项匹配的递归方法可能会起作用。

首先,
case
部分中的
x
是局部变量的别名。传递给方法的不是
x


其次,
\:x::\
匹配任何包含两个或更多元素的列表。因此,您的所有输出都是
true

首先,
case
部分中的
x
是局部变量的别名。传递给方法的不是
x

其次,
\:x::\
匹配任何包含两个或更多元素的列表。所以您的所有输出都是
true

这可能会起作用

  def contains(y: Int, l: List[Int]) = l match { // this is just l.contains(x)
    case _ :: x :: _  if(x == y)=> true
    case _ => false
  }
这可能行得通

  def contains(y: Int, l: List[Int]) = l match { // this is just l.contains(x)
    case _ :: x :: _  if(x == y)=> true
    case _ => false
  }

您的方法不起作用,因为模式匹配中的
x
绑定到第二个列表元素具有的任何值。这基本上是一个新的变量

S.K.答案的替代方案

def contains(y: Int, l: List[Int]) = l match { // this is just l.contains(x)
  case _ :: x :: _  => x == y
  case _ => false
}
或者你也可以写

def contains[A](y: A, l: Seq[Int]) = (l.lift)(1).exists(_ == y)

您的方法不起作用,因为模式匹配中的
x
绑定到第二个列表元素具有的任何值。这基本上是一个新的变量

S.K.答案的替代方案

def contains(y: Int, l: List[Int]) = l match { // this is just l.contains(x)
  case _ :: x :: _  => x == y
  case _ => false
}
或者你也可以写

def contains[A](y: A, l: Seq[Int]) = (l.lift)(1).exists(_ == y)

要匹配等于
x
的数字,可以将其放入反勾号中:

def contains(x: Int, l: List[Int]) = l match {
  case _ :: `x` :: _ => true
  case _ => false
}
不幸的是,
::
matcher只从列表中提取了一项–第一项,因此此代码只能在
l
中查找第二项:

scala> contains(1, List(1,2,3))
res2: Boolean = false

scala> contains(2, List(1,2,3))
res3: Boolean = true

scala> contains(3, List(1,2,3))
res4: Boolean = false
我相信,如果没有递归,您无法匹配列表中的任意项:

def contains(x: Int, l: List[Int]): Boolean = l match { // this is just l.contains(x)
  case `x` :: xs => true
  case _ :: xs => contains(x, xs)
  case _ => false
}

要匹配等于
x
的数字,可以将其放入反勾号中:

def contains(x: Int, l: List[Int]) = l match {
  case _ :: `x` :: _ => true
  case _ => false
}
不幸的是,
::
matcher只从列表中提取了一项–第一项,因此此代码只能在
l
中查找第二项:

scala> contains(1, List(1,2,3))
res2: Boolean = false

scala> contains(2, List(1,2,3))
res3: Boolean = true

scala> contains(3, List(1,2,3))
res4: Boolean = false
我相信,如果没有递归,您无法匹配列表中的任意项:

def contains(x: Int, l: List[Int]): Boolean = l match { // this is just l.contains(x)
  case `x` :: xs => true
  case _ :: xs => contains(x, xs)
  case _ => false
}

非常感谢。很遗憾,我不想要递归。谢谢。不幸的是,我不想要递归。太好了!谢谢如果(x==y)我能以某种方式摆脱这个
吗?@Michael,你为什么不想要那种防护条件?只是为了美观!谢谢如果(x==y)
我能摆脱这个
吗?@Michael,你为什么不想要那种防护条件?只是出于美学上的原因谢谢你提醒我关于反勾号的事。很遗憾,
::
只拿走了一件物品:(谢谢你提醒我关于反勾号。很遗憾,
只拿走了一件物品:(