2015-08-03 18 views
10

Da GHC user guide sembra che la maggior parte Pat può essere PBangPat, ma ci sono alcune eccezioni. per esempio. i colpi di livello superiore in un modulo (come !main) non sono consentiti e x : !xs non riesce a analizzarex : (!xs) parses grazie a @chi. Qual è la specifica formale su dove possono essere aggiunti i bangs? Ho esaminato alcuni capitoli della guida per l'utente e del rapporto ma non ho trovato nulla.Dove possono apparire i BangPatterns

+2

Buona domanda, anche se nel dubbio è probabilmente meglio non usare affatto i BangPattern ma il vecchio 'seq'. – leftaroundabout

+3

'x: (! Xs)' analizza – chi

risposta

6

Non ci sono specifiche formali accettate per BangPattern poiché non fanno parte di alcun rapporto Haskell. La cosa più vicina a una specifica è la Guida dell'utente insieme alla proposta haskell-prime a cui si collega.

Entrambe queste fonti menzionano esplicitamente che un modello di scoppio non è consentito al livello più alto di un modulo.

Per quanto riguarda x : !xs, Guida per l'utente ha questo da dire sulla sintassi dei modelli Bang:

si aggiunge una singola nuova produzione alla sintassi di modelli:

pat ::= !pat 

E ' dovrebbe essere letto in congiunzione con il rapporto Haskell 2010:

pat ::= lpat qconop pat 
     | lpat 

lpat ::= apat 
     | - (integer | float) 
     | gcon apat_1 ... apat_k 

apat ::= var [ @ apat] 
     | ... 
     | (pat) 
     | ... 

In base a queste regole x : !xs in realtà dovrebbe parse (dal !xs è un pat, il tutto è lpat qconop pat). Quindi la Guida per l'utente (e la proposta di haskell-prime) è sbagliata o GHC è sbagliato su questo punto.

Credo che in pratica la sintassi accettata da GHC sia "qualsiasi cosa che assomigli ad un'espressione valida" compresa l'interpretazione di (!x) come sezione dell'operatore !. Ad esempio, (! Just x) è accettato come modello ma non lo è (! ! x).

+2

In realtà [la sezione pertinente della Guida dell'utente] (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/bang-patterns.html#bang -patterns-sem) è così vecchio da collegarsi al rapporto * Haskell 98 *, e la grammatica BNF a quel tempo ha trattato diversamente la precedenza. [Per i modelli in particolare] (https://www.haskell.org/onlinereport/exps.html#sect3.17.1), l'aggiunta di 'pat :: =! Pat' significa aggiungerla alla * precedenza più bassa *. –

+0

Anche se inquietante, con questa lettura '(!! X)' * dovrebbe * funzionare ma non lo fa. –

+0

@ ØrjanJohansen, oh buon punto. Non ho provato a seguire i collegamenti al rapporto poiché avevo già aperto il rapporto 2010 in un'altra scheda. Ciò rende la descrizione più vicina alla realtà, anche se come dici tu non è ancora la stessa cosa. –