加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的“case”匿名函数真的有效吗?

发布时间:2020-12-16 09:34:37 所属栏目:安全 来源:网络整理
导读:迪亚斯卡拉, scala val f1: ((Int,Int)) = Int = { case (a,b) = a + b }f1: ((Int,Int)) = Int = function1scala val f2: (Int,Int) = Int = { case (a,b) = a + b }f2: (Int,Int) = Int = function2 呵呵? scala f1(1,2)res2: Int = 3 好… scala def ta
迪亚斯卡拉,

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]。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读