Czy jakoś można zadeklarować coś jakzadeklarować funkcji `` implicit` type` z parametrami
type F = (Int, Boolean)(implicit String) => Unit
w Scala?
Czy jakoś można zadeklarować coś jakzadeklarować funkcji `` implicit` type` z parametrami
type F = (Int, Boolean)(implicit String) => Unit
w Scala?
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
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 –