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,你为什么不想要那种防护条件?只是出于美学上的原因谢谢你提醒我关于反勾号的事。很遗憾,::
只拿走了一件物品:(谢谢你提醒我关于反勾号。很遗憾,:
只拿走了一件物品:(