2011-09-06 11 views
6

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.

Respuesta

5

Por lo que puedo decir, la "mejor" forma de implementar algo como esto no es implementar ISeq, sino clojure.lang.Seqable; en otras palabras, proporcione una implementación de (.seq) para asignar su ResultSet a una secuencia (posiblemente floja). Esa es la ruta que usa clojure para la mayoría de las colecciones (excepto? List) (las listas implementan ISeq, porque la API de la seq es ya un subconjunto de la API de la lista).

+0

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. –

+1

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) –

0

Creo que estoy malinterpretando su pregunta, pero ¿no usaría el mapa para aplicar una función a cada elemento en su resultado?

Cuestiones relacionadas