Scala中的“case”匿名函数真的有效吗?
迪亚斯卡拉,
scala> val f1: ((Int,Int)) => Int = { case (a,b) => a + b } f1: ((Int,Int)) => Int = <function1> scala> val f2: (Int,Int) => Int = { case (a,b) => a + b } f2: (Int,Int) => Int = <function2> 呵呵? scala> f1(1,2) res2: Int = 3 好… scala> def takesIntInt2Int(fun: (Int,Int) => Int) = fun(100,200) takesIntInt2Int: (fun: (Int,Int) => Int)Int scala> def takesTuple2Int(fun: ((Int,Int)) => Int) = fun(100,200) takesTuple2Int: (fun: ((Int,Int)) => Int)Int scala> takesIntInt2Int(f2) res4: Int = 300 scala> takesIntInt2Int(f1) <console>:10: error: type mismatch; found : ((Int,Int)) => Int required: (Int,Int) => Int takesIntInt2Int(f1) ^ scala> takesTuple2Int(f1) res6: Int = 300 scala> takesTuple2Int(f2) <console>:10: error: type mismatch; found : (Int,Int) => Int required: ((Int,Int)) => Int takesTuple2Int(f2) 对。现在,看看这个! scala> takesTuple2Int { case (a,b,c) => a + b + c } <console>:9: error: constructor cannot be instantiated to expected type; found : (T1,T2,T3) required: (Int,Int) takesTuple2Int { case (a,c) => a + b + c } ^ scala> takesIntInt2Int { case (a,Int) takesIntInt2Int { case (a,c) => a + b + c } 喜欢,srsly? o_O都导致必需:(Int,Int)错误。 为什么在这样的匿名函数中使用case? 解决方法
请参见Scala参考文献(
http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf)的8.5节。 {case(a,b)=> a b}根据预期类型进行不同的解释。在f1的定义中,它创建了一个PartialFunction [(Int,Int),Int],它被转换为一个Function1 [(Int,Int),Int],即((Int,Int))=> Int,而在f2的定义中,它创建了一个Function2 [Int,Int,Int],即(Int,Int)=>诠释。
这两种解释与两种情况有关,您将在匿名函数中常用案例。 一个是编写匿名函数,接受元组并对其组件进行处理,就像使用f1一样。一个例子是您在地图上传递给foreach或map方法的功能,例如映射(1→2,3→4)映射{case(k,v)=> k v}。 第二个是写一个匿名函数,在其唯一参数上进行匹配。你的f2是这样做的,但没有任何有用的方式。一个例子是传递给收集的匿名函数,例如列表(1,-2,3)收集{case x if x> 0 => -X }。 注意两个可以组合,就像f1这样的功能也可以做复杂的匹配。例如,如果k <1,则Map(1→2,3-4)收集{case(k,v) 2 => v}。 编辑:res2因为tupling工作。如果一个应用程序没有键入检查,那么编译器将尝试在一个元组之前将args包装到失败之前。 但这只是为应用程序而尝试的;这不是一般的转换,就像你发现的那样。它不会尝试将Function2 [A,B,C]值升级到Function1 [(A,B),C]。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |