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
risposta
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)
.
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 *. –
Anche se inquietante, con questa lettura '(!! X)' * dovrebbe * funzionare ma non lo fa. –
@ Ø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. –
Buona domanda, anche se nel dubbio è probabilmente meglio non usare affatto i BangPattern ma il vecchio 'seq'. – leftaroundabout
'x: (! Xs)' analizza – chi