Une fonction partielle est une fonction qui n'est valable que pour un sous-ensemble de valeurs de ces types, vous risquez de passer pour elle. Par exemple:
val root: PartialFunction[Double,Double] = {
case d if (d >= 0) => math.sqrt(d)
}
scala> root.isDefinedAt(-1)
res0: Boolean = false
scala> root(3)
res1: Double = 1.7320508075688772
Ceci est utile lorsque vous avez quelque chose qui sait comment faire pour vérifier si une fonction est définie ou non. Recueillir, par exemple:
scala> List(0.5, -0.2, 4).collect(root) // List of _only roots which are defined_
res2: List[Double] = List(0.7071067811865476, 2.0)
Ce n'est pas va vous aider à placer les deux arguments où vous voulez vraiment un.
En revanche, une application partielle de la fonction est une fonction où certains de ses arguments ont déjà été remplie.
def add(i: Int, j: Int) = i + j
val add5 = add(_: Int,5)
Maintenant vous avez seulement besoin d'un argument-la chose à ajouter 5 à--au lieu de deux:
scala> add5(2)
res3: Int = 7
Vous pouvez le voir sur cet exemple comment l'utiliser.
Mais si vous avez besoin de spécifier ces deux arguments, ce encore de ne pas le faire--dire que vous souhaitez utiliser map
, par exemple, et vous devez lui donner une fonction à un argument, mais vous souhaitez ajouter deux choses différentes. Eh bien, alors vous pouvez
val addTupled = (add _).tupled
qui sera partiellement appliquer la fonction (vraiment, il suffit de créer une fonction de la méthode, puisque rien n'a été rempli) et puis de combiner les différents arguments dans un tuple. Maintenant, vous pouvez l'utiliser dans des endroits qui nécessitent un seul argument (en supposant que le type est correct):
scala> List((1,2), (4,5), (3,8)).map(addTupled)
res4: List[Int] = List(3, 9, 11)
En revanche, le nourrissage est différent encore une fois, il tourne les fonctions de la forme (A,B) => C
en A => B => C
. C'est, compte tenu d'une fonction de plusieurs arguments, il va produire une chaîne de fonctions qui prennent chacun un argument et de retourner une chaîne d'un plus court (vous pouvez la considérer comme partiellement l'application de l'un argument à la fois).
val addCurried = (add _).curried
scala> List(1,4,3).map(addCurried)
res5: List[Int => Int] = List(<function1>, <function1>, <function1>)
scala> res5.head(2) // is the first function, should add 1
res6: Int = 3
scala> res5.tail.head(5) // Second function should add 4
res7: Int = 9
scala> res5.last(8) // Third function should add 3
res8: Int = 11