我经常发现自己与元组的列表,序列和迭代器一起工作,并希望做类似以下的事情,
val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }
Run Code Online (Sandbox Code Playgroud)
但是,编译器似乎从不同意这种语法.相反,我最终写作,
arrayOfTuples.map {
t =>
val e1 = t._1
val e2 = t._2
e1.toString + e2
}
Run Code Online (Sandbox Code Playgroud)
这真是太傻了.我怎么能绕过这个?
在python我可以这样做:
def f((a, b)):
return a + b
d = (1, 2)
f(d)
Run Code Online (Sandbox Code Playgroud)
这里传入的元组在传递给它时被分解f.
现在在scala我这样做:
def f(ab:(Int, Int)) : Int = {
val (a, b) = ab
a + b
}
val d = (1, 2)
f(d)
Run Code Online (Sandbox Code Playgroud)
我可以在这里做些什么,以便在传递参数时进行分解?只是好奇.
谢谢.
我想知道最好的方法是什么.
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
Run Code Online (Sandbox Code Playgroud)
我认为Odersky等人.在这个例子中,他们还有另一个技巧来降低噪音.
所以问题是如何在这里打击杂乱,假设你不允许改变baz(例如def baz(a: (String Int)))的实现.
在Haskell中你可以写:
x :: (Int,Int) -> Int
x (p,s) = p
Run Code Online (Sandbox Code Playgroud)
在Scala中你会写:
def x(a: (Int, Int)) = a._1
Run Code Online (Sandbox Code Playgroud)
要么:
def x(a: (Int, Int)) = a match {
case (p, s) => p
}
Run Code Online (Sandbox Code Playgroud)
为什么不喜欢这样的东西
def x(_: (p: Int, s: Int)) = p
Run Code Online (Sandbox Code Playgroud)
要么
def x(foo: (p @ Int, s @ Int)) = p
Run Code Online (Sandbox Code Playgroud)
?