tengo una estructura de datos en Clojure que representa un conjunto de resultados de un experimento:¿Debo implementar la interfaz Sec en clojure
(defprotocol ResultSet
(columns [rs] "return a collection of the columns in the resultset, represented by keywords")
(rows [rs] [rs column-keys] "returns a seq of the rows in the resultset, order and column specified as keywords by column-keys. with a single argument returns rows with all columns present"))
Y tengo una deftype
que implementa este protocolo. Estoy interesado en escribir funciones que hacen cosas como asignar una función a todos los resultados en el conjunto de resultados, o que doblar sobre el conjunto de resultados, básicamente haciendo las mismas cosas que las funciones seq integradas.
En Haskell, haría esto implementando las clases de tipos relevantes (por ejemplo, Functor) y luego usando funciones como fmap o mfilter. Así que investigué haciendo esto en Clojure y terminé con algunas ideas sobre la implementación de la interfaz ISeq.
Entonces, ¿es esta una buena idea? No puedo encontrar muchos recursos sobre la implementación de ISeq y me pregunto cuál es el enfoque idiomático de esto.
Esto me permitirá hacer algo así como devolver la secuencia subyacente de filas en un conjunto de resultados, pero no me permite mapear una función sobre un 'Results' y obtener un' Results' ¿verdad? EDITAR: Me acabo de dar cuenta de que el mapa incorporado no se comporta de esta manera, tal vez estoy tratando de hacer algo incorrecto. –
Como dices en tu edición, las funciones de secuencia de clojure generalmente llaman (seq) a la colección proporcionada y luego trabajan y devuelven seqs, no cualquier tipo específico de colección. Parece un poco intuitivo al principio, pero en la práctica funciona muy bien. Todo lo que realmente necesitas es alguna forma de convertir un seq nuevamente en el tipo de colección que necesitas, cuando realmente lo necesitas (lo cual no es muy frecuente, una vez que trabajas en seqs - podría valer la pena considerar si incluso necesitas un tipo ResultSet en absoluto) –