2013-10-26 3 views

ответ

10

Да, это возможно.

Если у вас есть второй выделанной параметр помечен как 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! 

Вы должны указать функцию непосредственно внутри метода, так как он не был неявно предусмотрено ранее.

+0

Спасибо за объяснение обоих случаев (с и без импликации) с подробными примерами. – Prasanna

Смежные вопросы