2016-02-19 19 views
9

Czy jakoś można zadeklarować coś jakzadeklarować funkcji `` implicit` type` z parametrami

type F = (Int, Boolean)(implicit String) => Unit 

w Scala?

+0

Niestety Usunąłem mój komentarz, że „można zrobić typu f = (int, boolean) => (String) => Jednostka mimo to ". Masz rację mówiąc, że nie działa z implikami, myślę, że to dlatego, że nie powinieneś polegać na nich w swoich typach. Funkcja, która przyjmuje wartości Int i a Boolean, jest funkcją, która pobiera wartość Int i wartość logiczną niezależnie od implikowanych wartości w zakresie. edytuj: Ok, ven odpowiedział poniżej, metoda nie jest funkcją, a funkcje nie mają implikacji –

Odpowiedz

18

Jest to bardzo ważne rozróżnienie pomiędzy „Scala w funkcji” i „Metoda”:

Funkcje są wartościami i nie może brać argumenty po nazwie, nie może być polimorficzny, nie może być o zmiennej liczbie argumentów , nie mogą być przeciążone i nie mogą mieć niejawnych parametrów. Chociaż metody mogą je mieć, nie mogą być przekazywane jako wartości.

typy funkcyjne są tylko cechy w bibliotece standardowej, o następującej postaci:

trait FunctionN[T1, ..., TN, R] { 
    def apply(x1: T1, ..., xN: TN): R 
} 

Uwaga jaki sposób w tych typach apply robi nie mają niejawny listę parametrów. Dlatego funkcje nigdy nie będą mieć ukrytych parametrów.

Więc jeśli chcesz przekazać „funkcje”, które mają parametry ukryte, trzeba utworzyć własną cechę:

trait Function2I1[T1, T2, I1, R] { 
    def apply(a1: T1, a2: T2)(implicit i1: I1): R 
} 

type F = Function2I1[Int, Boolean, String, Unit] 

Teraz można tworzyć instancje typu F (choć nie z błyszczącą lambda składni):

val f = new F { 
    override def apply(x: Int, y: Boolean)(implicit z: String): Unit = ??? 
} 
implicit val x = "hi" 
f(1, true) // implicitly passes x 

Jeśli chcesz funkcji curried bez parametrów ukrytych, wystarczy napisać (Int, Boolean) => String => Unit.

Jeśli chcesz przekonwertować metodę funkcji, należy użyć lambda:

class A { 
    def f(a: String)(implicit b: String): String = a + b 
} 
val a = new A 
val m = a.f(_) // takes the implicit in this scope 
Powiązane problemy