2014-01-10 5 views
3

Учитывая следующие функции:вызове функций, возвращаемые методами, которые принимают implicits

def foo()(implicit count: Int): (String => Seq[String]) = { 
    s => for (i <- 1 until count) yield s 
} 

Вызов apply() на результат явно работает:

implicit val count = 5 

val x = foo().apply("x") // <- works fine 

И приравнивая результат к val, который вам затем вызывается как функция, работает:

val f: String => Seq[String] = foo() 
f("y") // <- works fine 

Но пытаться сделать все это в одной строке, без apply, путает компилятор, думая, вы передаете неявное явным образом:

val z = foo()("z") // type mismatch; found: String("z"), required: Int 

Есть ли способ сделать это без любого явного apply или промежуточного val? Например, возможно ли каким-либо образом переместить объявление implicit в возвращаемую анонимную функцию?

ответ

2
scala> (foo() _)("z") 
res10: Seq[String] = Vector(z, z, z, z) 
Смежные вопросы