2012-05-18 16 views
6

Sto cercando di ridurre la mia confusione sulla sintassi di Haskell e vorrei scoprire quali sono gli spazi dei nomi separati in Haskell.Quali spazi dei nomi simbolo ci sono in Haskell?

Spazi dei nomi che indicano spazi dei nomi sintattici corrispondenti alle varie tabelle di simboli gestite dal compilatore, non gli ambiti dei nomi definiti nel codice.

Ad esempio:

  • nomi di valore (come nomi di funzione)
  • costruttori dati
  • costruttori di tipo
  • parametri di tipo (a definizioni di tipo)
  • istanze?
  • ...?

mi interessa perché io sto avendo difficoltà a leggere il codice Haskell (sicuramente più che con qualsiasi altra lingua) perché ho spesso un momento difficile capire cosa esattamente sto guardando (in particolare con i dati/type costruttori/dichiarazioni di tipo).

Haskell sembra riutilizzare una manciata di costrutti sintattici (esp <name> <name> ....) In molti posti e si basa su contesto - solo scopre che il compilatore è molto meglio a questo di me ...

risposta

13

The Haskell Report §1.4 says

ci sono sei tipi di nomi a Haskell: quelli per variabili e costruttori valori denotano; quelli per variabili di tipo, tipo costruttori e classi di tipo fare riferimento a soggetti legati al tipo sistema; e nome modulo fare riferimento ai moduli. Ci sono due vincoli sull'assegnazione del nome:

  1. nomi per le variabili e digitare variabili sono identificatori che iniziano con le lettere minuscole o underscore; gli altri quattro tipi di nomi sono identificatori che iniziano con lettere maiuscole.
  2. Un identificatore non deve essere utilizzato come nome di un costruttore di tipi e di una classe nello stesso ambito.

Questi sono i soli vincoli; ad esempio, Int può essere contemporaneamente il nome di un modulo, classe e costruttore all'interno di un singolo ambito.

+3

Ci sono anche i nomi infissi a livello di valore e tipo. Per le variabili (a entrambi i livelli), sono composte da simboli e iniziano con qualsiasi carattere tranne un ':'. Per i costruttori (a entrambi i livelli) sono composti da simboli e iniziano con ':'. I costruttori di tipo Infix sono come ricordo solo un'estensione GHC. – sclv

+0

Questa è la risposta che stavo cercando, grazie! – Martin

+0

Ciò che ha aggiunto alla mia confusione sono state le giunzioni di primo livello di Template Haskell, che assomigliano alle definizioni di funzione con '=' mancanti e inoltre non hanno una regola di maiuscole (e ancora riutilizziamo il '' 'modello ...) . Per riferimento http://www.haskell.org/ghc/docs/latest/html/users_guide/template-haskell.html – Martin

5

La confusione può essere evitato se si assicuratevi di capire quello che stai leggendo:

  1. espressione: qui ogni nome maiuscolo è un costruttore di dati o di una variabile qualificato o costruttore mentre minuscole sono valori
  2. un tipo: qui ogni nome in maiuscolo è un costruttore di tipi o un nome di classe, mentre i nomi in minuscolo sono variabili di tipo.