.curried & .uncurried

Currificación totalmente tipada como getters de extensión: el reemplazo nativo de Dart para el curry de FxTS.

R Function(B) Function(A) get curried // on R Function(A, B), up to arity 5 R Function(A, B) get uncurried // on R Function(B) Function(A), up to 5 levels

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.

Nota: la cadena es estrictamente unaria — la aplicación mixta de FxTS 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 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.
Relacionado: pipe — composición, el principal consumidor de funciones aplicadas parcialmente · identity & always — otras utilidades sobre la forma de las funciones · apply — despliega una lista en argumentos posicionales