Siempre que en Haskell necesitemos algún tipo de datos variantes, usaríamos ADT junto con la coincidencia de patrones. ¿Qué usan los Clojure para tales usos?¿Reemplazo de Clojure para ADT y coincidencia de patrones?
Respuesta
Bueno, en realidad hay algunas bibliotecas de patrones de coincidencia escritas para Clojure. Las macros de Clojure hacen que este tipo de cosas sea posible. Matchure es uno de los más recientes. Incluso hay algunas cosas para ADTs in contrib.
Sin tener en cuenta eso, lo más parecido que tenemos a los ADT de Haskell en el núcleo Clojure son los nuevos registros y tipos de datos en Clojure 1.2. Pero, a menos que necesite los beneficios que provienen de usar un registro o tipo de datos, generalmente solo usará un mapa. Clojure es un lenguaje dinámico, por lo que no obtendrá verificación de tipo estático si utiliza un registro y de todos modos.
Clojure tiene "desestructuración" que recuerda a la coincidencia de patrones, y se usa mucho en Clojure idiomático. Ver this y this. El primero es una respuesta tuya verdaderamente aquí en SO. ; P
mirada a matchure biblioteca - que debe ser incluido en clojure-contrib en tiempo casi
me gusta mucho Yap como una biblioteca de coincidencia de patrones.
El hecho de tener tanto palabras clave como símbolos hace que la implementación de la variante sea bastante fácil en la parte superior de una biblioteca de coincidencias de patrones.
Depende un poco de lo que está tratando de hacer. Pero suponiendo el caso común de querer comportamiento polimórfico basado en el tipo de datos, protocolos son a menudo una buena aproximación:
(defprotocol Fooable
(foo [x]))
(defrecord AType [avalue]
Fooable
(foo [x]
(println (str "A value: " (:avalue x)))))
(defrecord BType [avalue]
Fooable
(foo [x]
(println (str "B value: " (:bvalue x)))))
(foo (AType. "AAAAAA"))
=> A value: AAAAAA
(foo (BType. "BBBBBB"))
=> B value: BBBBBB
En este contexto, el protocolo define de forma eficaz el conjunto de operaciones que desee en su ADT, y los registros de definir los valores posibles del ADT así como el comportamiento polimórfico para las funciones de protocolo.
- 1. Funciones de coincidencia de patrones en Clojure?
- 2. Separación y técnicas de coincidencia de patrones
- 3. coincidencia de patrones - implementación
- 4. Coincidencia de patrones y flujos infinitos
- 5. Coincidencia de patrones no especializados
- 6. Clase de caso y argumentos implícitos y coincidencia de patrones
- 7. Notación libre de puntos, recurrencia y coincidencia de patrones
- 8. rendimiento de coincidencia de patrones Erlang
- 9. coincidencia de patrones de estilo en C++?
- 10. Coincidencia de patrones de listas en Python
- 11. implícito dentro de coincidencia de patrones
- 12. Seq de coincidencia de patrones en Haskell
- 13. coincidencia de patrones en los gráficos
- 14. Coincidencia de patrones, F # vs Erlang
- 15. Haskell - coincidencia de patrones azúcar sintáctico y donde
- 16. Coincidencia de patrones Perl al utilizar matrices
- 17. Coincidencia de patrones vs if-else
- 18. f # coincidencia de patrones con tipos
- 19. Coincidencia de patrones en una expresión let
- 20. Diferencias entre la coincidencia de patrones y la unificación?
- 21. Coincidencia de patrones con operadores asociativos y conmutativos
- 22. coincidencia de patrones para la cadena que tiene "{"
- 23. variable en xsl: template coincidencia de patrones
- 24. Scala: ¿coincidencia de patrones con enunciados condicionales?
- 25. Script Bash para iterar archivos en el directorio y nombres de archivo de coincidencia de patrones
- 26. Reemplazo de varios patrones en un bloque de datos
- 27. coincidencia de patrones Haskell en GADTs con tipos de datos
- 28. Coincidencia de patrones de la lista anidada en Haskell
- 29. entendimiento de coincidencia de patrones con el operador contras
- 30. Enfoque de coincidencia de formas/patrones en Computer Vision