隐式的Scala功能文字

问题描述

| 请原谅我是否已经在其他地方提出过这个要求。我有一个涉及函数值和隐式参数的Scala语法问题。 我对Scala的currying功能使用隐式感到很自在。例如,如果我有一个sum函数,并想将第二个参数设为隐式:
scala> def sum(a: Int)(implicit b: Int) = a + b
sum: (a: Int)(implicit b: Int)Int
有没有一种方法可以使用函数值语法?暂时忽略隐式函数,我通常会这样写咖喱函数值:
scala> val sum2 = (a: Int) => (b: Int) => a + b
sum: (Int) => (Int) => Int = <function1>
但是,第二种方法中的功能签名却大不相同(正在明确地表示该过程)。仅向b添加隐式关键字没有多大意义,编译器也会抱怨:
scala> val sum2 = (a: Int) => (implicit b: Int) => a + b
<console>:1: error: \'=>\' expected but \')\' found.
       val sum2 = (a: Int) => (implicit b: Int) => a + b
                                              ^
此外,从第一种方法中部分应用求和来获得函数值也会引起问题:
scala> val sumFunction = sum _
<console>:14: error: could not find implicit value for parameter b: Int
       val sumFunction = sum _
                         ^
这使我相信,具有隐式参数的函数必须在创建函数值时(而不是稍后再应用函数值时)确定所述参数。真的是这样吗?您可以使用带有函数值的隐式参数吗? 谢谢您的帮助!     

解决方法

        
scala>  val sum2 = (a: Int) => {implicit b: Int => a + b}
sum2: (Int) => (Int) => Int = <function1>
这将使b成为函数体范围的隐式值,因此您可以调用期望隐式Int的方法。 我不认为您可以为函数使用隐式参数,因为目前尚不清楚函数是什么。是
Int => Int
还是
() => Int
? 我找到的最接近的是:
scala> case class Foo(implicit b: Int) extends (Int => Int) {def apply(a: Int) = a + b}
defined class Foo

scala> implicit val b = 3
b: Int = 3

scala> Foo()
res22: Foo = <function1>

scala> res22(2)
res23: Int = 5
    ,        在这个片段中
scala> val sum2 = (a: Int) => (b: Int) => a + b
sum: (Int) => (Int) => Int = <function1>
请注意,
sum2
的精确类型为
Function1[Int,Function1[Int,Int]]
。也可以写成
val sum2 = new Function1[Int,Int]] {
    def apply(a: Int) = new Function1[Int,Int] {
        def apply(b: Int) = a + b
    }
}
现在,如果您尝试使
b
隐式,您将得到:
scala>     val sum2 = new Function1[Int,Int]] {
     |         def apply(a: Int) = new Function1[Int,Int] {
     |             def apply(implicit b: Int) = a + b
     |         }
     |     }
<console>:8: error: object creation impossible,since method apply in trait Function1 of type (v1: Int)Int is not defined
               def apply(a: Int) = new Function1[Int,Int] {
                                       ^
或者,换句话说,
Function
的接口没有隐式参数,因此具有隐式参数的任何内容都不是
Function
。     ,        尝试重载apply方法。
scala> val sum = new Function1[Int,Int]] {
         |      def apply(a: Int) = (b: Int) => a + b
         |      def apply(a: Int)(implicit b: Int) = a + b
         |}
sum: java.lang.Object with (Int) => (Int) => Int{def apply(a:Int)(implicit b: Int): Int} = <function1>

scala> sum(2)(3)
res0: Int = 5

scala> implicit val b = 10
b: Int = 10

scala> sum(2)
res1: Int = 12
    

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...