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

Another approach would be to make parameter lists and tuples the same thing in the language.

于 2011-06-19T01:31:59.490 回答