2011-06-12 54 views
9

我想知道做到这一点的最佳方法是什么。调用使用元组作为参数列表的方法

val foo = Some("a") 
val bar = Some(2) 

def baz(a: String, b: Int) = if((b % 2) == 0) Some(a+","+b) else None 

(x zip y) flatMap baz //does not compile of course 
(x zip y) flatMap { x => baz(x._1, x._2) } //ugly 

我会推测Odersky et al。在这个例子中,他们还有另一个技巧来减少噪音。

所以问题是如何在这里打击混乱,假设你不允许改变baz(例如def baz(a: (String Int)))的实现。

+0

+1我知道这是一种重复,但恕我直言标题是更好的方式,所以它会被更多人发现:) – fresskoma 2011-06-12 16:35:45

回答

17

这个问题已经在这里找到答案:scala tuple unpacking

首先,FOO通过部分应用程序的功能,然后调用tupled与参数列表:

(foo _).tupled(myTuple) 
+1

谢谢! (x zip y)flatMap(baz _)。tupled就像一个魅力。 – 2011-06-12 15:22:13

1

最常见的方式,以干净解压任何与模式或理解:

for ((a,b) <- (x zip y); c <- baz(a,b)) yield(c) 
相关问题