Scala Function.tuple和占位符语法
我在另一个例子中看到了Function.tuple的这种用法:Scala Function.tuple和占位符语法,scala,scala-2.8,Scala,Scala 2.8,我在另一个例子中看到了Function.tuple的这种用法:Map(1->“one”,2->“two”)Map Function.tuple(->.length) 它的工作原理是: scala> Map(1 -> "one", 2 -> "two") map Function.tupled(_ -> _.length) <console>:5: warning: method tupled in object Function is deprecated:
Map(1->“one”,2->“two”)Map Function.tuple(->.length)
它的工作原理是:
scala> Map(1 -> "one", 2 -> "two") map Function.tupled(_ -> _.length)
<console>:5: warning: method tupled in object Function is deprecated:
Use `f.tuple` instead
Map(1 -> "one", 2 -> "two") map Function.tupled(_ -> _.length)
^
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 2 -> 3)
直接使用占位符语法不起作用:
scala> Map(1 -> "one", 2 -> "two") map (_._1 -> _._2.length)
<console>:5: error: wrong number of parameters; expected = 1
Map(1 -> "one", 2 -> "two") map (_._1 -> _._2.length)
scala>Map(1->“一”,2->“二”)Map(u.1->u.2.长度)
:5:错误:参数数量错误;期望值=1
地图(1->“一”,2->“二”)地图(u.1->u.2.长度)
Function.tuple是如何工作的?在Function.tuple(\u->\ u0.length)
中似乎发生了很多事情。还有,我如何使用它来不获取弃用警告?更新
今天,针对这一问题,人们提出了反对意见
对函数进行元组化就是将
函数n[A1,A2,…,AN,R]
调整为函数1[(A1,A2,…,AN),R]
Function.tuple
被弃用,取而代之的是Function\tuple
。这样做的一个(可能是无意的)后果是类型推断器无法推断以下类型的参数类型:
scala> Map(1 -> "one", 2 -> "two") map (_ -> _.length).tupled
<console>:5: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$minus$greater(x$2.length))
Map(1 -> "one", 2 -> "two") map (_ -> _.length).tupled
^
<console>:5: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$minus$greater(x$2.length))
Map(1 -> "one", 2 -> "two") map (_ -> _.length).tupled
我建议您阅读最近这个问题的答案,以便更深入地了解函数文本中的“u2;”以及类型推断的工作原理:
更新
作为对评论的回答,它确实如此
scala> val f = (x:Int, y:String) => x + ": " + y
f: (Int, String) => java.lang.String = <function2>
scala> f.tupled
res0: ((Int, String)) => java.lang.String = <function1>
scala> Map(1 -> "1") map f.tupled
res1: scala.collection.immutable.Iterable[java.lang.String] = List(1: 1)
scala>valf=(x:Int,y:String)=>x+“:”+y
f:(Int,String)=>java.lang.String=
scala>f.tuple
res0:((Int,String))=>java.lang.String=
scala>映射(1->“1”)映射f.tuple
res1:scala.collection.immutable.Iterable[java.lang.String]=List(1:1)
这需要Scala 2.8。请注意,如果函数的返回类型为
Tuple2
,则Map#Map可能会生成另一个Map,否则将生成一个列表,如上所述。谢谢您的回答。让我困惑的是这不起作用:valf=(x:Int,y:String)=>x+“:”+y;f、 元组
。这不应该返回一个在(Int,String)元组上工作的f版本吗?好的,我明白了,这解释了很多。我用2.8.0.Beta1重新测试了它,它按预期工作。早些时候,我尝试了2.8.0.Beta1-RC5,我的路径中有。我需要摆脱RC5…@huynhjl对Function.tuple的反对是因为理解到函数必须知道如何在没有帮助的情况下对自己进行tuple。然而,这在类型推断中确实不起作用。我当然希望他们不要删除Function.tuple,而不让类型推断器足够聪明来解决这个问题。
scala> Map(1 -> "one", 2 -> "two") map { case (a, b) => a -> b.length }
res8: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 2 -> 3)
scala> Map(1 -> "one", 2 -> "two") map ((_: Int) -> (_: String).length).tupled
res9: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 2 -> 3)
scala> Map(1 -> "one", 2 -> "two") map ((p: (Int, String)) => p._1 -> p._2.length)
res12: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 2 -> 3)
scala> val f = (x:Int, y:String) => x + ": " + y
f: (Int, String) => java.lang.String = <function2>
scala> f.tupled
res0: ((Int, String)) => java.lang.String = <function1>
scala> Map(1 -> "1") map f.tupled
res1: scala.collection.immutable.Iterable[java.lang.String] = List(1: 1)