2011-09-19 9 views
7

Acabo de tropezar con el paquete OneTuple en hackage. Quiero saber su propósito, estoy seguro de que el autor no lo creó solo por el gusto de hacerlo. Entonces, ¿cuándo puede ser útil esto? Está bastante claro lo que hace, pero no cuando uno lo usaría.¿Cuándo querría uno usar OneTuple?

Entonces, ¿alguien sabe algunos buenos ejemplos cuando puede beneficiarse de esto? ¿O tal vez mostrar la belleza matemática detrás de esto?

+1

"Estoy seguro de que el autor no lo creó solo por diversión": es posible que esté subestimando el sentido del humor de la comunidad Haskell. – MatrixFrog

+0

Lo que dijo la rana. Consulte la categoría del paquete acme para ver ejemplos de paquetes sin una razón real para existir. –

Respuesta

3

Es casi el mismo que el Identity mónada, que se utiliza comúnmente como la base de una pila transformador mónada, excepto que desde OneTuple utiliza data en lugar de newtype que tiene un valor inferior adicional.

Es interesante porque, en cierto sentido, es el ejemplo más trivial de la mayoría de las clases de tipos que implementa. Aunque no veo mucho uso práctico para eso.

+2

Solo veo un uso práctico al crear una capa adicional de direccionamiento indirecto, por ejemplo, para evitar que se evalúe el thunk interno. – fuz

2

Creo que es una broma, como el paquete don't. Dicho esto, OneTuple agrega un único valor nuevo a cualquier tipo (a diferencia de Maybe, que agrega dos: Nothing y Just undefined o undefined dependiendo de cómo se balancee su embarcación). Entonces, si alguna vez resulta que lo necesita, ya sabe a dónde ir ...

+0

'don't' parece ser bastante útil para la depuración, por ejemplo, si desea" comentar "algunas operaciones monádicas. – fuz

+2

Utilizo el operador '--' para eso :-) – sclv

4

Supongamos que tiene una clase de tipo (un poco tonta) que opera en tuplas. Tiene una instancia para (a,a), una instancia para (a,a,a). También quiere una instancia para un solo valor. ¡Pero no puedes simplemente crear una instancia para a porque eso se superpondría con todo lo demás! Sin embargo, puede crear una instancia para OneTuple a.

Ahora que typeclass es un poco inútil, pero es fácil imaginar una clase de tipo casi parecida pero más útil. De hecho, este es precisamente el uso de Only en la biblioteca MySQL bos': http://hackage.haskell.org/packages/archive/mysql-simple/0.2.0.2/doc/html/Database-MySQL-Simple-QueryResults.html

3

Este es sin duda no una broma, al igual que la implementación mónada identidad no es una broma. A diferencia del tipo simple a obtienes todas las instancias útiles, y obtienes la parte inferior adicional, que acerca mucho más la tupla singleton a la semántica de los otros tipos de tupla.

Un caso de uso para esto es, al igual que la mónada de identidad, la generalización. Tiene una función monádica/aplicativa, que tiene un tipo de funcionador polimórfico. Por ejemplo, muchos paquetes útiles como enumerador soportan operar sobre una mónada elegida por el usuario. La semántica ligeramente diferente de OneTuple (en comparación con Identity) puede ser muy útil, cuando tiene dependencias de datos complicadas o quiere hacer uso de la pereza adicional, que Identity no le proporciona.

Cuestiones relacionadas