Можно ли сделать что-то вроде следующего?Scala: Функция перевернутой карри как параметр
def takeCurriedFnAsArg(f: (Int)(implicit MyClass) => Result)
Можно ли сделать что-то вроде следующего?Scala: Функция перевернутой карри как параметр
def takeCurriedFnAsArg(f: (Int)(implicit MyClass) => Result)
Да, это возможно.
Если у вас есть второй выделанной параметр помечен как implicit
, функция, кажется, не типа
Int => (MyClass => Result) => ResultOfFunction
, который было бы, если кэрри выше параметр функции порядка был постоянным параметром; вместо этого, он выглядит следующим образом:
Int => ResultOfFunction
Вот краткий пример:
scala> def curriedFn(i : Int)(implicit func : String => Int) : Boolean = (i + func("test!")) % 2 == 0
curriedFn: (i: Int)(implicit func: String => Int)Boolean
scala> implicit val fn : String => Int = s => s.length
fn: String => Int = <function1>
scala> curriedFn _
res4: Int => Boolean = <function1>
Как вы можете видеть, параметр implicit
получил "устранен. Почему и как? Это вопрос для кого-то более знающего, чем я. Если бы я должен был догадаться, я бы сказал, что компилятор напрямую заменяет параметр с неявным значением, но это может быть очень ложным.
Во всяком случае, экскурсы в сторону, вот пример очень отношение к вашей ситуации:
scala> def foo(func : Int => Boolean) = if(func(3)) "True!" else "False!"
foo: (func: Int => Boolean)String
scala> foo(curriedFn)
res2: String = True!
Теперь, если второй параметр функции не подразумевалось:
scala> def curriedNonImplicit(i : Int)(fn : String => Int) : Boolean = (i + fn("test!")) % 2 == 0
curriedNonImplicit: (i: Int)(fn: String => Int)Boolean
scala> curriedNonImplicit _
res5: Int => ((String => Int) => Boolean) = <function1>
Как вы можете видеть, тип функции немного отличается. Это означает, что решение будет выглядеть по-другому тоже:
scala> def baz(func : Int => (String => Int) => Boolean) = if(func(3)(s => s.length)) "True!" else "False!"
baz: (func: Int => ((String => Int) => Boolean))String
scala> baz(curriedNonImplicit)
res6: String = True!
Вы должны указать функцию непосредственно внутри метода, так как он не был неявно предусмотрено ранее.
Спасибо за объяснение обоих случаев (с и без импликации) с подробными примерами. – Prasanna