Skip to content

Commit 83c955e

Browse files
committed
Currying con comentarios. Dificil concepto, espero que el ejemplo ayude a entenderlo
1 parent 9330302 commit 83c955e

1 file changed

Lines changed: 35 additions & 1 deletion

File tree

  • modules/src/main/java/com/platzi/functional/_12_currying

modules/src/main/java/com/platzi/functional/_12_currying/Currying.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,57 @@
33
import java.util.function.Function;
44

55
public class Currying {
6+
/**
7+
* Empecemos con algo que ya conocemos: una FunctionalInterface que toma 3 tipos de datos
8+
* F, S, T y devuelve un tipo de dato R cuando se manda a llamar su metodo apply.
9+
* <p>
10+
* Hasta que no deberia haber nada nuevo.
11+
*/
612
@FunctionalInterface
713
interface ThreeFunction<F, S, T, R> {
814
R apply(F f, S s, T t);
915
}
1016

1117
static void curryingExample() {
18+
/*
19+
Tener tres parametros puede hacer que nos confundamos en el orden mientras programamos.
20+
Y tenemos un detalle, tal vez, por alguna razon, al momento de querer ejecutar esta funcion
21+
no contamos con los 3 datos.
22+
*/
1223
ThreeFunction<Integer, String, Double, String> threeFunction = (i, s, d) -> "";
13-
1424
threeFunction.apply(1, "", 0.0);
1525

26+
/*
27+
Que tal si pudieramos simplificar nuestra funcion?
28+
29+
A reducir la complejidad de una funcion partiendola en subfunciones, se le conoce como currying.
30+
31+
Currying es una manera de crear funciones mas dinamicas basados en al reduccion de parametros.
32+
*/
1633
Function<Integer, Function<String, Function<Double, String>>> curried = curryThree(threeFunction);
1734

1835
curried.apply(1)
1936
.apply("")
2037
.apply(0.0);
2138
}
2239

40+
/**
41+
* Esta funcion, se encarga de tomar una funcion compleja de 3 parametros y simplificarla a una funcion de un
42+
* solo parametro.
43+
* <p>
44+
* Desafortunadamente, los generics de java complican un poco su lectura. pero es relativamente sencillo entender
45+
* lo que pasa:
46+
* <p>
47+
* curryThree toma una funcion de tres parametros ThreeFunction<F,S,T,R> y genera una version mas "simple".
48+
*
49+
* Esa version "simple" es una funcion que retorna otra funcion que retorna otra funcion.
50+
*
51+
* Es decir, tendremos 3 funciones que se pueden encadenar y generar el mismo resultado o ir ejecutando
52+
* una funcion a la vez conservando un estado anterior.
53+
*
54+
* El beneficio es que ahora tenemos una funcion mas simple de un solo parametro y que podemos reutilizar
55+
* para generar funciones "intermedias".
56+
*/
2357
static <F, S, T, R> Function<F, Function<S, Function<T, R>>> curryThree(ThreeFunction<F, S, T, R> threeFunction) {
2458
return first ->
2559
second ->

0 commit comments

Comments
 (0)