Clojure es increíble, todos lo sabemos, pero ese no es el punto. Me pregunto cuál es la forma idiomática de crear y administrar funciones de orden superior de una manera similar a Haskell. En Clojure que pueda hacer lo siguiente:Funciones de orden superior en Clojure
(defn sum [a b] (+ a b))
Pero (sum 1)
no devuelve una función: se produce un error. Por supuesto, se puede hacer algo como esto:
(defn sum
([a] (partial + a))
([a b] (+ a b)))
En este caso:
user=> (sum 1)
#<core$partial$fn__3678 [email protected]>
user=> ((sum 1) 2)
3
Pero no parece que la forma correcta de proceder. ¿Algunas ideas? No estoy hablando de implementar la función sum
, estoy hablando a un nivel más alto de abstracción ¿Hay algún patrón idiomático a seguir? Algunos macro? ¿Es la mejor manera de definir una macro o hay soluciones alternativas?
Gracias por la respuesta rápida. Ya he consultado esa publicación, y me pregunto si las soluciones propuestas se adoptan en algunos subpaquetes clojure.contrib o son solo un brunch de ideas posibles :) –
¿Puedo inferir de su respuesta que cree que las funciones varían? y las funciones auto-curried no son compatibles entre sí? Si es así, me gustaría saber más sobre el motivo. Gracias. – day
Dado '(defn f ([x] 1) ([x y] 2))', ¿qué devuelve '(f true)'? Debe ser 1, lo que significa que no se puede curvar automáticamente como una aplicación parcial de la versión de dos aries. – amalloy