2013-07-25 9 views
15

Sto cercando di capire la spiegazione in Monads made difficult e ho difficoltà a capire la seguente definizione newtype:Haskell Newtype con parentesi

newtype (FComp g f) x = FComp { unCompose :: g (f x) } 

instance (Functor b c f, Functor a b g) => Functor a c (FComp g f) where 
    fmap f (FComp xs) = FComp $ fmap (fmap f) xs 

ho nulla visto una spiegazione di ciò che significa newtype con un'espressione tra parentesi al posto della dichiarazione del tipo. Pertanto non riesco a capire quale sia la definizione della funzione fmap. Inoltre, non capisco perché la funzione di accesso al campo unCompose sia definita ma mai utilizzata. Mi sento come se mi mancasse qualche semantica di base di newtype.

risposta

11

Si potrebbe scrivere questo:

newtype (FComp g f) x = FComp { unCompose :: g (f x) } 

in questo modo:

newtype FComp g f x = FComp (g (f x)) 
unCompose (FComp it) = it 

Questo è così perché l'applicazione tipo ha le stesse proprietà sintattiche come applicazioni normali, vale a dire:

a b c = (a b) c 

vale per i valori a, b, c e per i tipi a, b, c.

15

un piccolo test:

newtype (FComp g f) x = FComp { unCompose :: g (f x) } 
newtype FComp2 g f x = FComp2 { unCompose2 :: g (f x) } 

*Main> :i FComp 
newtype FComp g f x = FComp {unCompose :: g (f x)} 
     -- Defined at Test.hs:34:10 
*Main> :i FComp2 
newtype FComp2 g f x = FComp2 {unCompose2 :: g (f x)} 
    -- Defined at Test.hs:35:9 

Così le parentesi davvero non cambia nulla. È proprio come senza di loro.

Per quanto riguarda lo uncompose, è solo un nome per scartare lo newtype senza rendere esplicito il costruttore di dati. Nello snippet che hai pubblicato usano la corrispondenza dei pattern, ma non si vorrebbe esportare i dettagli di implementazione, quindi unCompose viene fornito per utilizzare il contenuto di FComp. Questo è lo stesso delle definizioni data, solo che newtype vuole esattamente un campo invece di 0..n.

+2

+1 per testarlo effettivamente. – Ingo

+0

Uno probabilmente * vorrebbe * esportare i dettagli di implementazione, almeno in quanto c'è solo una cosa che potrebbero essere. A volte è più conveniente utilizzare una funzione di decompressione rispetto alla corrispondenza del modello. –

Problemi correlati