10

Haskellでは次のように書くことができます:

x :: (Int,Int) -> Int
x (p,s) = p

Scalaでは次のように書きます。

def x(a: (Int, Int)) = a._1

また:

def x(a: (Int, Int)) = a match {
    case (p, s) => p
}

のようなものを持ってみませんか

def x(_: (p: Int, s: Int)) = p

また

def x(foo: (p @ Int, s @ Int)) = p

4

4 に答える 4

11

探している機能はデストラクチャリングと呼ばれ、一般な形式では、タプルの解凍だけではありません。パターンマッチング構文の自然な拡張であるため、Scalaがそれを持っていることを望んでいることがよくあります。

def first((f: Int, l: Int)) = f
def displayName(Person(first, last)) = last + ", " + first

破壊(一種の)変数/値の定義の形で存在します:

val (f, l) = tuple
val Person(first, last) = person

残念ながら、そのような定義の周りにはいくつかの 安全性 の問題があり、パラメータリストですぐに破壊が見られる可能性は低いと思います。

于 2011-06-19T04:47:26.100 に答える
4

タプルのタイプに対応する引数リストを受け取る関数を作成し、Function.tupledその関数に適用してから、タプルを適用できます。

scala> def fun(x:Int,y:Int)=x+y
fun: (x: Int,y: Int)Int

scala> val tuple = (1,2)
tuple: (Int, Int) = (1,2)

scala> Function.tupled(fun _)(tuple)
res9: Int = 3

このようにして、問題の有効な回避策を達成します

于 2011-06-19T03:31:10.890 に答える
2

これは多重ディスパッチと呼ばれ、JVMではサポートされていません。Scalaメソッドを書き直して明示的な一致を不要にすることもできますが、そうすることは優先事項ではありません。

興味深いことに、それはある意味で関数に対してサポートされていますが、すべてのバリアントが一緒に表示される必要があるという制限があります。例えば:

def x: ((Int, Int)) => Int = {
    case (p, _) => p
}
于 2011-06-19T03:34:20.180 に答える
0

別のアプローチは、パラメータリストとタプルを言語で同じものにすることです。

于 2011-06-19T01:31:59.490 に答える