2013-10-04 7 views
4

следующие работы:Функция черта и неявные параметры

object X extends (Int => String => Long) { 

    def apply(x:Int):String => Long = ??? 
} 

Как я мог ввести в apply функцию с параметром implicit?

я следующий метод:

def apply(x:Int)(implicit y:String):Long = ??? 

Как я могу описать тип функции?

object X extends <functionType> { 
    def apply(x:Int)(implicit y:String):Long = ??? 
} 

обновление

Я мог бы определить это так:

object X extends (Int => String => Long) { 

    def apply(x:Int):(String => Long) = ??? 
    def apply(x:Int)(implicit y:String):Long = ???; 
} 

Но называя это не работает:

error: ambiguous reference to overloaded definition, 
both method apply in object X of type (x: Int)(implicit y: String)Long 
and method apply in object X of type (x: Int)String => Long 
match argument types (Int) 
       X(3) 
      ^

ответ

3

Единственное, что приходит на ум это:

object X { 
    def apply(i: Int)(implicit y: String): Long = ??? 

    implicit def xToFun(x: X.type)(implicit y: String): Int => Long = x(_) 
} 

неявное преобразование позволит использовать X везде, где Int => Long необходимо, и неявное String параметр будет решена, когда применяется, что преобразование (не тогда, когда X.apply на самом деле)

val fun: Int => Long = X //error, no implicit String in scope 

implicit val s = "fuu" 
val fun: Int => Long = X //OK 
+0

Вы, конечно, дали мне пищу для размышлений, спасибо! – EECOLOR

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