2015-11-06 6 views
6

In questo paper v'è una funzione con la seguente firma:capire la differenza tra due firme Haskell, uno che utilizza forall

vreplicate :: forall a n . SNatI n => a -> Vec a n 

Qual è la differenza tra questa firma e quello che non ha forall:

vreplicate :: SNatI n => a -> Vec a n 

? Avevo l'impressione che senza lo forall implicasse implicitamente lo stesso numero di fronte allo forall che nomi tutte le variabili di tipo.

+1

Ho la mia stessa impressione. Se la carta è pesante per la matematica, potrebbero semplicemente usare la notazione esplicita per il gusto di essere espliciti. – Carcigenicate

+1

@Carcigenicate In realtà, no, c'è una differenza se si tenta di compilare. Con 'ScopedTypeVariables', funziona con' forall' ed errori senza. Codice nel caso in cui sei interessato: https://gist.github.com/anonymous/b288970d38595be68229 – Ana

risposta

10

Ci sono due casi importanti in cui l'inclusione di uno forall fa la differenza. Il primo è che la posizione di un forall può cambiare il significato di un tipo - se si trova a sinistra di una freccia, significa che un argomento per la funzione è "più polimorfico" di altrimenti. Questa differenza è fondamentale; tuttavia, non sembra applicarsi qui.

La seconda differenza è una sintattica (ma non fondamentali) uno, vale a dire: in presenza di ScopedTypeVariables, variabili legate da un forall aprire una portata di battitura, mentre le variabili implicitamente legate senza forall no. Pertanto, nel corpo di vreplicate, è possibile utilizzare le variabili di tipo a e n ed assicurarsi che si riferiscano agli stessi tipi menzionati nella firma di vreplicate. Senza il forall (o senza ScopedTypeVariables), utilizza di a e n nel corpo del vreplicate introdurrebbe freschi variabili universalmente quantificate, e sarebbe responsabilità del programmatore per assicurarsi che sono stati unificati con i tipi nella firma di vreplicate se questo erano desiderati Ulteriori dettagli sono disponibili in the documentation.

Senza leggere attentamente il documento non posso esserne sicuro, ma scommetto fortemente che quest'ultimo sta accadendo qui.

+1

Il secondo paragrafo è. Grazie mille per la spiegazione. – Ana

Problemi correlati