有沒有辦法在Scala中分解函數的輸入參數(akin to Clojure)?解構Scala中的輸入參數嗎?
所以,相反的
scala> def f(p: (Int, Int)) = p._1
f: (p: (Int, Int))Int
我想有這樣的(它不工作):
scala> def f((p1, p2): (Int, Int)) = p1
有沒有辦法在Scala中分解函數的輸入參數(akin to Clojure)?解構Scala中的輸入參數嗎?
所以,相反的
scala> def f(p: (Int, Int)) = p._1
f: (p: (Int, Int))Int
我想有這樣的(它不工作):
scala> def f((p1, p2): (Int, Int)) = p1
我猜在Scala中,你會使用模式匹配來實現相同的,例如像這樣:
val f: (Int, Int) => Int = { case (p1, p2) => p1 }
,或等效:
def f(p: (Int, Int)) = p match { case(p1, p2) => p1 }
如果類型可以推斷,該(Int, Int) => Int
可以被丟棄:
List((1, 2), (3, 4)) map { case (p1, p2) => p1 }
我寧願避免使用模式匹配作爲一個過於詳細的解決方案。不過,如果沒有其他的慣用方法,我可以接受它。有一個嗎? – 2013-05-01 21:10:05
不是我所知道的... – ValarDohaeris 2013-05-01 21:17:43
@JacekLaskowski - 這是最好的你會得到。元組和方法參數沒有完全統一,這是您注意到的地方之一。然而,你可以使用'def f(p1:Int,p2:Int)= p1 + p2',然後使用'(f_)。tupled'來創建一個函數,該函數可以接收一個元組,即使'def'具有獨立的參數。 – 2013-05-01 22:03:52
def f(p: ((Int, Int), (Int, Int))) = p._1 > f: (p: ((Int, Int), (Int, Int)))(Int, Int)
f((1,2), (3,4)) > res1: (Int, Int) = (1,2)
請求相同的Scala的問題跟蹤:https://issues.scala-lang.org/browse/SI-7909 – retronym 2013-10-12 21:07:21