Функциональные литералы Scala с имплицитами

Простите меня, если об этом уже где-то спрашивали. У меня есть вопрос о синтаксисе Scala, включающий значения функций и неявные параметры.

Мне удобно использовать неявные выражения с функцией каррирования Scala. Например, если бы у меня была функция суммы и я хотел бы сделать второй аргумент неявным:

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>

Однако сигнатура функции во втором подходе сильно отличается (каррирование выражается явно). Простое добавление ключевого слова implicit к 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 _
                         ^

Это приводит меня полагать, что функции, которые имеют неявные параметры, должны иметь указанные параметры, определенные при создании значения функции, а не когда значение функции применяется позже. Так ли это на самом деле? Можно ли когда-нибудь использовать неявный параметр со значением функции?

Спасибо за помощь!

25
задан shj 13 June 2011 в 02:22
поделиться