【问题标题】:How to make two function parameters as implicit如何将两个函数参数设为隐式
【发布时间】:2013-06-25 11:45:24
【问题描述】:

假设我们有将函数作为apply 方法参数的对象:

object Wrapper {
  def apply(block: TypeA => String) = {
    TypeA a = ...
    block(a)
  }
}

TypeA 是应用程序的域类型。

现在,当我定义内联块时,我可以将 TypeA 参数定义为隐式:

Wrapper { implicit a => functionThatUseImplicitA() } 

但是如果block参数不是Function1,而是Function2呢?如何将两个参数都定义为隐式?

object Wrapper2 {
  def apply(block: (TypeA, TypeB) => String) = {
    TypeA a = ...
    TypeB b = ...
    block(a, b)
  }
}

这个不行:

Wrapper { implicit (a, b) => functionThatUseImplicitAB() } 

唯一的解决方法是将它们定义为 val:

Wrapper { (a, b) => 
  implicit val ia = a
  implicit val ib = b
  functionThatUseImplicitAB()
} 

谢谢!

【问题讨论】:

    标签: scala


    【解决方案1】:

    根据SLS6.23 匿名函数 implicit 关键字只允许用于单参数函数:

    Expr ::= (Bindings | [‘ implicit ’] id | ‘_’) ‘=>’ Expr
    ResultExpr ::= (Bindings | ([‘ implicit ’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block
    

    所以你不能将两个函数参数设为隐式。

    这是使用柯里化函数的原因之一:

    object Wrapper {
      def apply(block: TypeA => TypeB => String) = ???
    }
    
    Wrapper { implicit a => implicit b =>
      functionThatUseImplicitAB()
    } 
    

    【讨论】:

    • 你能告诉我如何用柯里化函数解决这个问题吗? functionThatUseImplicit* 来自外部 API
    • @AlexeyRomantchouk:我已经更新了我的答案。当您可以更改 Wrapper 的定义时,它可以解决您的问题。
    • 谢谢!这正是我要找的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2012-05-04
    • 2020-07-15
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多