【问题标题】:scala function with implicit parameters具有隐式参数的 scala 函数
【发布时间】:2018-05-03 02:38:07
【问题描述】:

我有如下的scala函数,

scala> def getOrders: (String, String) => Seq[String] = (user: String, apiToken: String) => Seq.empty[String] 
def getOrders: (String, String) => Seq[String]

scala> getOrders("prayagupd", "A1B2C3") 
val res0: Seq[String] = List()

我想传入第三个参数作为隐式参数,但对于函数来说似乎不可能。

这是我想用一种方法实现的,

scala> def getOrders(user: String, apiToken: String)(implicit clientType: String) = Seq.empty[String] 
def getOrders
  (user: String, apiToken: String)(implicit clientType: String): Seq[String]

scala> implicit val clientType: String = "android" 
implicit val clientType: String = "android"

scala> getOrders("prayagupd", "A1B2C3") 
val res2: Seq[String] = List()

这似乎是不可能的,因为apply 函数是预定义的,它不会额外接受隐式参数。

scala> new Function2[String, String, Seq[String]] {
          def apply(user: String, apiToken: String): Seq[String] = Seq.empty
         } 
val res4: (String, String) => Seq[String] = <function2>

重载也无济于事,

scala> new Function2[String, String, Seq[String]] {
          def apply(user: String, apiToken: String): Seq[String] = Seq.empty
          def apply(user: String, apiToken: String)(implicit clientType: String) = Seq("order1")
         } 
val res9: (String, String) => Seq[String] = <function2>

scala> implicit val clientType: String = "device" 
implicit val clientType: String = "device"

scala> res9("prayagupd", "apiToken") 
val res10: Seq[String] = List()

是完全不推荐implicits 用于函数还是我遗漏了什么?

【问题讨论】:

标签: scala implicit


【解决方案1】:

实验性的,你的函数可能不带隐式表示如下:

scala> def getOrders: (String, String) => (String) => Seq[String] = (user: String, apiToken: String) => (clientType: String) => Seq.empty[String]
def getOrders: (String, String) => String => Seq[String]

四处寻找......它不喜欢implicit 那里可能给你想要的任何地方。

related question 的回答暗示了原因:getOrders “... 是一种方法,而不是函数,并且在隐式应用之前不会尝试 eta-expansion(将方法转换为函数)。”似乎隐式是在方法级别而不是函数级别解决的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多