2012-02-13 15 views
12

Il pacchetto void sostiene di fornire un tipo di inabitabili chiamato Void, che viene definita come segue -Tipo inutile giocoleria per definire Data.Void (pacchetto "void" su Hackage)?

newtype Void = Void Void 

Come è questa definizione di meglio che usare qualcosa di più semplice? Dire -

data Void 

Se la mia comprensione è corretta, entrambi i tipi di dati contengono solo valori di fondo. Tuttavia, quest'ultimo è molto più facile da capire.

EDIT: Ok, ho capito la risposta di Daniel qui sotto. Tuttavia ho pensato ad un altro modo forse più semplice per farlo rimanendo compatibile con Haskell98. Possiamo utilizzare un tipo di dati Abstract e non esporre alcun costruttore all'utente.

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

Ora solo il codice nel modulo Data.Void può costruire un vuoto, tuttavia, poiché sappiamo che non, il tipo di dati Void è effettivamente disabitata.

Questo lavoro o mi manca qualcosa qui?

+0

"Ora solo il codice nel modulo Data.Void può costruire un vuoto" che è un modulo di troppo. – PyRulez

+0

Beh, sì .. Capisco che ora, dopo aver letto [commento di Carl] (http://stackoverflow.com/questions/9261490/unnecessary-type-juggling-to-define-data-void-package-void-on-hackage ? noredirect = 1 # comment11678217_9261699) :) –

risposta

15

Dalla descrizione per il pacchetto vuoto su Hackage: "A Haskell 98 tipo di dati logicamente disabitato" (il mio accento). Dichiarare Void come semplicemente data Void richiederebbe Haskell 2010 o l'estensione della lingua "EmptyDataDecls" e quindi non sarebbe "Haskell 98".

EDIT

Here is a page sul Haskell Wiki che descrive esattamente questa situazione.

+0

Ottimo, quindi posso usare la mia definizione se la compatibilità con haskell98 non è importante per me. Grazie! –

+0

Ho aggiunto un altro possibile (e più semplice) modo di farlo in Haskell98. Cosa ne pensi? –

+2

@AnupamJain Questo non è più semplice o addirittura corretto. L'unica ragione per cui esiste il pacchetto nullo è di avere un tipo con fondi inferiori come unici abitanti possibili. Non riescono ad esportare un costruttore non significa che il costruttore non esiste. La formulazione del nuovo tipo dimostra che solo il fondo può abitare il tipo. Questo è importante per rendere la funzione assurda nel typecheck del modulo, per esempio. – Carl

6

L'implementazione è ancora incompleta, perché non si ha la funzione di assurdo:

absurd :: Void -> a 

Void si suppone che sia un oggetto iniziale di Haskell, che è il motivo per cui avete bisogno della funzione assurda. Trovo l'attuazione di assurdo nel pacchetto vuoto di essere molto elegante e appropriato:

absurd (Void a) = absurd a 

Questa definizione ricorda l'analogia logica del Vuoto alla falsa premessa da cui qualsiasi conclusione può essere derivata. Usa persino l'errore logico di riferirsi per dimostrare se stesso, che è logicamente ... assurdo.

Problemi correlati