2012-02-13 18 views
12

El paquete void pretende ofrecer un tipo llamado inhabitable Void, que se define de la siguiente manera -tipo de malabarismo innecesario para definir Data.Void (paquete "vacío" en Hackage)?

newtype Void = Void Void 

¿Cómo es esta definición hay nada mejor que usar algo más sencillo? Diga -

data Void 

Si mi comprensión es correcta, ambos tipos de datos contienen solo valores inferiores. Sin embargo, este último es mucho más fácil de entender.

EDIT: Bien, entonces entiendo la respuesta de Daniel a continuación. Sin embargo, pensé en otra forma posiblemente más simple de hacerlo mientras permanecía compatible con Haskell98. Podemos usar un tipo de datos abstracto y no exponer constructores al usuario.

module Data.Void (Void) where 
    data Void = Void 

Ahora sólo el código en el módulo Data.Void puede construir un vacío, sin embargo, ya que sabemos que no , el tipo de datos vacío es efectivamente deshabitado.

¿Eso funcionaría o me falta algo aquí?

+0

"Ahora solo el código en el módulo Data.Void puede construir un Void" que es un módulo demasiado. – PyRulez

+0

Bueno, sí ... Entiendo que ahora, después de leer [Comentario de Carl] (http://stackoverflow.com/questions/9261490/unnecessary-type-juggling-to-define-data-void-package-void-on-hackage ? noredirect = 1 # comment11678217_9261699) :) –

Respuesta

15

De la descripción del paquete vacío en Hackage: "A Haskell 98 tipo de datos lógicamente deshabitado" (énfasis mío). Declarar Void como simplemente data Void requeriría Haskell 2010 o la extensión de lenguaje "EmptyDataDecls" y por lo tanto no sería "Haskell 98".

EDITAR

Here is a page en el Haskell wiki que describe exactamente esta situación.

+0

Genial, entonces puedo usar mi propia definición si la compatibilidad con haskell98 no es importante para mí. ¡Gracias! –

+0

Agregué otra posible (y más simple) forma de hacerlo en Haskell98. ¿Qué piensa usted de eso? –

+2

@AnupamJain Eso no es más simple o incluso correcto. La única razón por la que existe el paquete void es tener un tipo con fondos como los únicos habitantes posibles. No exportar un constructor no significa que el constructor no existe. La formulación de tipo nuevo demuestra que solo los fondos pueden habitar el tipo. Esto es importante para hacer que la función absurda en el tipo de módulo de verificación, por ejemplo. – Carl

6

Su aplicación es aún incompleta, ya que no tiene la función absurda:

absurd :: Void -> a 

Void se supone que es un objeto inicial en Haskell, que es por eso que necesita la función absurdo. Encuentro la implementación de absurdo en el paquete vacío sea muy elegante y apropiado:

absurd (Void a) = absurd a 

Esta definición es una reminiscencia de la analogía lógica de vacío a la falsa premisa de la que ninguna conclusión puede ser derivado. Incluso usa la falacia lógica de referenciarse para probarse a sí mismo, que es lógicamente ... absurdo.

Cuestiones relacionadas