2013-06-27 22 views
11

Sto leggendo il codice sorgente di Data.Map e trovo che!() È utilizzato nel costruttore di dati di data Map k a.Cosa significa!() Nel costruttore di dati?

data Map k a = Tip 
       | Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a) 

Trovo che il !() non influisce sul modo l'abbinamento Patten contro i dati. Nella funzione di mapWithKey, la corrispondenza del patten è ancora per 5 cose. Quindi non lo considero un operatore.

mapWithKey f (Bin sx kx x l r) 

Dopo googleing, ho trovato che il !() possono essere correlati a -XBangPatterns che viene utilizzato per evalution artificiale. Ho ragione ? O è per un altro scopo?

risposta

20

! nelle dichiarazioni del tipo di dati viene utilizzato per indicare la rigidità. Se abbiamo search for it on Hoogle, vediamo un collegamento a keyword !, che spiega il comportamento. Il rapporto defines il comportamento esatto.

In data Foo = Foo ... !T ..., il costruttore Foo forza la sua argomentazione, ad esempio Foo ... x ... = x `seq` RealFoo ... x .... dove RealFoo è il costruttore che otterresti senza lo !.

{-# UNPACK #-} è un'estensione GHC che significa che lo Size (ad esempio Int) viene memorizzato in modalità non in linea, direttamente come parte del tipo di dati.

+0

Grazie per la risposta. Oh, quindi mi sbaglio completamente? Non è per una valutazione pigra, ma per valutare i valori degli argomenti. Ma non sono sicuro del motivo per cui il pacchetto impone la rigidità sulla mappa. Senza la rigidità, possiamo ancora fare la ricerca, mappatura quando stiamo andando attraverso l'albero della mappa – code4j

+0

'Data.Map' è spin-string per l'efficienza. In realtà, l'efficienza è la ragione principale per cui le persone di solito si preoccupano di aggiungere rigore. – shachaf

+0

Grazie per la spiegazione :) – code4j

3

In un costruttore di dati! indica che gli argomenti sono valutati quando il tipo è costruito. Questo costringe le funzioni ad essere valutate e ti aiuta a controllare i requisiti di spazio della tua applicazione.

Le diapositive high-performance Haskell trattano questo in modo più dettagliato.

+3

'BangPatterns' è un'estensione che fa qualcos'altro. Questo è solo un campo rigoroso. – shachaf

+0

Grazie per aver corretto il mio fraintendimento! –

Problemi correlati