scala – 为什么这个部分应用程序不能编译?
发布时间:2020-12-16 18:58:19 所属栏目:安全 来源:网络整理
导读:下列: val add = (a: Int,b: Int) = a + b 转换为: object add extends Function2[Int,Int,Int] { def apply(a: Int,b: Int) = a + b} 而 val a1 = add(_: Int,3) 转换为: object a1 extends Function1[Int,Int] { def apply(x: Int): Int = { add(x,3) }
下列:
val add = (a: Int,b: Int) => a + b 转换为: object add extends Function2[Int,Int,Int] { def apply(a: Int,b: Int) = a + b } 而 val a1 = add(_: Int,3) 转换为: object a1 extends Function1[Int,Int] { def apply(x: Int): Int = { add(x,3) } } 但当我这样做时: scala> val a2 = add _ a2: () => (Int,Int) => Int = <function0> 然后调用a2,它会抛出一个错误: scala> a2(1,2) <console>:11: error: too many arguments for method apply: ()(Int,Int) => Int in trait Function0 a2(1,2) ^ 为什么是这样?为什么以下工作? a2()(1,2) 解决方法
add已经是Function2 [Int,Int].如果你想让a2具有相同的类型,那么简单的赋值就足够了.
scala> val a2 = add a2: (Int,Int) => Int = <function2> scala> a2(1,2) res3: Int = 3 您正在考虑的是将方法扩展为函数.如果我们有: def add(a: Int,b: Int): Int = a + b 然后,我们将使用add _来获取eta-expansion以赋值. scala> def a2 = add _ a2: (Int,Int) => Int scala> a2(1,2) res4: Int = 3 但是add已经是一个函数,所以下划线有不同的含义. add现在是一个值,而不是一个方法.由于add是一个值,它就像一个返回Function2 [Int,Int]的无参数方法.如果我们尝试进行eta扩展,我们得到()=> Function2 [Int,Int]. 考虑一个更简单的例子,其中我们有一个简单的val a = 1.a基本上与返回1(def a = 1)的无参数方法相同.如果我试图获得eta扩展,我会得到()=>诠释. scala> val a = 1 a: Int = 1 scala> val a2 = a _ a2: () => Int = <function0> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |