.curried & .uncurried
Currificación totalmente tipada como getters de extensión: el reemplazo nativo de Dart para el curry de FxTS.
Lección
Currificar convierte una función de varios argumentos en una cadena de
funciones unarias: add(1, 2) pasa a ser
add.curried(1)(2). La ganancia es la aplicación
parcial: fijar el primer argumento produce una función nueva, que
es justo la forma que esperan callbacks como map y
filter.
FxTS lo ofrece como función, curry(f), apoyándose en dos cosas
que Dart no tiene: reflexión de aridad en tiempo de ejecución
(fn.length) y tipos condicionales recursivos. FxDart, en
cambio, declara una extensión por aridad (2–5), todas exponiendo el mismo
getter curried, y deja que el compilador elija la correcta a
partir del tipo estático de la función. El despacho por aridad que
FxTS hace en tiempo de ejecución ocurre aquí en tiempo de compilación, y el
resultado está totalmente tipado, sin ni un solo cast:
add.curried(1) es un int Function(int).
.uncurried es la operación inversa: aplana una cadena de
funciones unarias de vuelta a una única función de varios argumentos.
Cuando la cadena está anidada más de dos niveles, gana la aridad
coincidente más profunda; aplica una extensión de forma explícita
(Uncurry2(f).uncurried) para aplanar menos niveles. La
historia completa del diseño — incluido por qué el getter se llama
curried y no curry — está en
WHY_CURRIED.md.
Demo 1 · Fundamentos
Demo 2 · Aplicación parcial en un pipeline
Una función binaria currificada encaja directamente en map, sin
necesidad de un closure envoltorio:
Demo 3 · Ida y vuelta con uncurried
Los closures currificados a mano se aplanan de vuelta a la forma data-first, y
curried / uncurried son inversas exactas:
Pruébalo tú
Ejercicio: usa .curried para construir una función
clampTo100 a partir del clamp de abajo, y luego mapéala sobre la lista.
add(1, 2)(3) no tiene equivalente. Los parámetros
con nombre y los valores tipados como Function a secas no
encajan con las extensiones; ahí escribe un closure. Los parámetros
posicionales opcionales sí encajan, pero en la cadena ese hueco
pasa a ser obligatorio. El stub de nivel superior curry, ya
obsoleto, solo sigue ahí para guiar hasta aquí a quien migre desde FxTS.