当我阅读《 scala中的功能编程》这本书时。 我发现这样的表达式:
case (Cons(h, t), Empty) =>
Some(f(Some(h()), Option.empty[B]) -> (t(), empty[B]))
有什么区别
Some(f(Some(h()), Option.empty[B]), (t(), empty[B]))
答案 0 :(得分:1)
如果第二个示例可以编译,则应在编译时显示警告:creating a 2-tuple: this may not be what you want
否则将失败,因为Some()
不使用两个参数。第一个示例应该编译,因为->
显式创建了元组以作为单个参数发送到(外部)Some()
。
创建两个元素的元组时,可以选择使用括号和逗号(5, true)
或箭头5 -> true
。在大多数情况下,使用箭头版本时,括号是可选的。
如果您想要两个以上的元素(即非嵌套元组),则不能使用箭头:
'c' -> 'b' -> 'x'
//res0: ((Char, Char), Char) = ((c,b),x)
答案 1 :(得分:0)
->
实际上是ArrowAssoc类的一种方法,每个对象都可以隐式转换为该方法。参见对象scala.Predef
。定义为:
def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
这意味着1 -> 2
等效于1.->(2)
,其求值为Tuple2(1, 2)
。本书(第3版)第21.4节对此也进行了解释。