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))

OK、次は直接翻訳に挑戦します。これはどう?

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 に答える