Una función parcial es una función que es válida solo para un subconjunto de valores de esos tipos que puede pasarle. Por ejemplo:
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
Esto es útil cuando tiene algo que sabe cómo comprobar si una función está definida o no. Recoge, por ejemplo:
scala> List(0.5, -0.2, 4).collect(root) // List of _only roots which are defined_
res2: List[Double] = List(0.7071067811865476, 2.0)
Ésta es no va a ayudarle a colocar dos argumentos donde realmente se desea.
el contrario, una función aplicada parcialmente es una función donde algunos de sus argumentos ya han sido rellenado
def add(i: Int, j: Int) = i + j
val add5 = add(_: Int,5)
Ahora sólo necesita un argumento -. Lo que hay que añadir 5 a-- en lugar de dos:
scala> add5(2)
res3: Int = 7
Puede ver en este ejemplo cómo usarlo.
Pero si es necesario especificar esos dos argumentos, este todavía no lo hará - que usted quiere utilizar map
, por ejemplo, y hay que darle una función de un argumento, pero que quieren es para agregar dos cosas diferentes. Bueno, a continuación, puede
val addTupled = (add _).tupled
que se aplicará parcialmente la función (en realidad, basta con crear una función fuera del método, puesto que nada ha sido rellenado) y luego combinar los argumentos separados en una tupla. Ahora usted puede utilizar esto en lugares que requieren un único argumento (suponiendo que el tipo es correcta):
scala> List((1,2), (4,5), (3,8)).map(addTupled)
res4: List[Int] = List(3, 9, 11)
Por el contrario, Currying es diferente una vez más; convierte las funciones del formulario (A,B) => C
en A => B => C
. Es decir, dada una función de argumentos múltiples, producirá una cadena de funciones que cada una toma un argumento y devuelve una cadena más corta (se puede pensar que se aplica parcialmente un argumento a la vez).
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
Supongo que está hablando de la función parcialmente aplicada, es decir, convertir '(arg1, arg2 => result' en' arg2 => result' mediante el suministro de un 'arg1'? Porque" función parcial "puede significar algo bastante diferente , y ese algo (por desgracia, en este caso) también está disponible en Scala, con el mismo nombre. Además, ¿cuál es tu pregunta? El título contiene un signo de interrogación, pero el cuerpo de tu publicación realmente no encaja. – delnan
En orden para ser claro, sugiero 'PartialFunction' en' Scala' rename to 'HalfFunction' :). – ssj