Domanda Perché Haskell non ha una sintassi di costrutore Data.Map letterale?


Sono ancora nuovo di Haskell (imparando e spegnendo). Mi chiedo perché Haskell non abbia un letterale Data.Map sintassi del costruttore, come la sintassi del costruttore Map / Hash in Clojure o Ruby. C'è una ragione? Ho pensato che poiché Haskell ha una sintassi del costruttore letterale per Data.List, ci dovrebbe essere uno per Data.Map.

Questa domanda non vuole essere affatto critica. Vorrei solo saperne di più su Haskell attraverso le risposte.


20
2018-05-28 14:19


origine


risposte:


Oltre alle risposte già date (nonostante l'incidente storico), penso che ci sia anche qualcosa da dire per l'uso di Data.Map in Haskell rispetto a Hash in Ruby o cose simili; oggetti simili a mappe in altre lingue tendono a vedere molto più uso per lo spazio di archiviazione generale ad-hoc.

Considerando che in Haskell dovresti sferzare un data definizione in poco tempo, la creazione di una classe in altri linguaggi tende ad essere un po 'pesante, e quindi troviamo che anche per i dati con una struttura ben nota, useremo solo un Hash o dict o simili. Il fatto che abbiamo una sintassi diretta per farlo rende un'opzione ancora più attraente.

Contrasto a Lisp: utilizzo MAKE-HASH-TABLE e poi più volte SETFè relativamente fastidioso (simile all'utilizzo Data.Map), quindi tutto viene inserito in elenchi annidati, perché è ciò che è conveniente.

Allo stesso modo, sono felice che la scelta più conveniente per la memorizzazione dei dati sia la creazione di nuovi tipi adatti, e poi me ne vado Data.Map a quando in realtà sto costruendo una mappa o tabella hash come componente intrinseco. Ci sono alcuni casi in cui ritengo che la sintassi sarebbe bella (di solito solo per i programmi throw-away più piccoli), ma in generale non mi manca.


12
2018-05-29 10:49



A differenza di Clojure e Ruby, le mappe di Haskell sono fornite come librerie. Questo ha dei compromessi: ad esempio, come hai notato, non esiste una sintassi integrata per le mappe finite; tuttavia, poiché è una libreria, possiamo (e facciamo) avere molte implementazioni alternative, e tu come programmatore puoi scegliere quello più appropriato per i tuoi usi.


17
2018-05-28 14:27



Haskell ha una sintassi speciale per gli elenchi perché in un linguaggio funzionale pigro prendono più o meno il posto delle strutture di controllo del ciclo in lingue imperative. Quindi sono molto più importanti di Map nel grande schema.

Inoltre, so che ti riferivi a [1,2,3] quando hai detto "sintassi dell'elenco", ma volevo aggiungere quell'elenco costruttore la sintassi potrebbe quasi essere implementato in haskell-98, in quel tipo i costruttori possono essere infissi quando iniziano :, per esempio.

data Pair = Int :-- Int

Quindi il costruttore della lista : è solo un leggero caso speciale di questa regola generale di sintassi, che è piuttosto elegante. Ad alcuni manca questo.


7
2018-05-28 16:30



In realtà non sono sicuro del motivo per cui nessuno lo ha indicato in una risposta (c'è solo il commento di sam boosalis) ma con OverloadedLists puoi praticamente ottenere la sintassi letterale per Map e Set:

{-# LANGUAGE OverloadedLists #-}

import Data.Map
import Data.Set

foo :: Map Int Int
foo = [(1,2)]

bar :: Set Int
bar = [1]

da lì è solo un altro passo per ottenere mappe ancora più belle, ad esempio:

a =: b = (a,b)

ages :: Map String Int
ages = [ "erik"  =: 30
       , "john"  =: 45
       , "peter" =: 21 ]

Anche se personalmente preferisco l'esplicito oltre implicito, quindi a meno che non sto costruendo una DSL, mi piacerebbe continuare a farlo fromList e (foo, bar) - Haskell parla delle grandi vincite, non quelle piccole.


5
2018-01-05 13:17



Haskell ha un costruttore di mappe, ma è "nascosto" (come un metodo privato in un paradigma orientato agli oggetti). Siete incoraggiati ad usare costruttori "pubblici", come ad esempio vuoto, singleton o listaDa. Tuttavia, se si ispeziona il codice, disponibile all'indirizzo https://hackage.haskell.org/package/containers-0.4.0.0/docs/src/Data-Map.html , ottieni la seguente definizione

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

Puoi usare il Mancia e Bidone costruttori, ma non è raccomandato.


-1
2018-03-02 17:36