функция scala с неявными параметрами - PullRequest
0 голосов
/ 03 мая 2018

У меня есть функция 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()

Неужели implicit s вообще не рекомендуется для функций или я что-то упустил?

1 Ответ

0 голосов
/ 03 мая 2018

Экспериментально, ваша функция может быть выражена следующим образом без неявного:

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 где-то там, что может дать вам то, что вы хотите.

Ответ на связанный вопрос предлагает причину: getOrders "... это метод, а не функция, и eta-расширение (которое преобразует методы в функции) не предпринимается до тех пор, пока неявное приложение. " Похоже, что последствия разрешаются на уровне метода, а не на уровне функции.

...