9

在 ML 中,可以为匹配模式的每个元素指定名称:

fun findPair n nil = NONE
| findPair n (head as (n1, _))::rest =
    if n = n1 then (SOME head) else (findPair n rest)

在这段代码中,我为列表的第一对定义了一个别名并匹配这对的内容。Scala中是否有等效的构造?

4

2 回答 2

14

您可以使用符号进行变量绑定,例如:@

scala> val wholeList @ List(x, _*) = List(1,2,3)
wholeList: List[Int] = List(1, 2, 3)
x: Int = 1
于 2012-11-03T05:17:19.883 回答
0

我相信您稍后会得到更完整的答案,因为我不确定如何像您的示例一样递归地编写它,但也许这种变化对您有用:

scala> val pairs = List((1, "a"), (2, "b"), (3, "c"))
pairs: List[(Int, String)] = List((1,a), (2,b), (3,c))

scala> val n = 2
n: Int = 2

scala> pairs find {e => e._1 == n}
res0: Option[(Int, String)] = Some((2,b))

好的,下次尝试直接翻译。这个怎么样?

scala> def findPair[A, B](n: A, p: List[Tuple2[A, B]]): Option[Tuple2[A, B]] = p match {
     | case Nil => None
     | case head::rest if head._1 == n => Some(head)
     | case _::rest => findPair(n, rest)
     | }
findPair: [A, B](n: A, p: List[(A, B)])Option[(A, B)]
于 2012-11-03T04:01:49.687 回答