effetti estensibili in purescript

5

In Purescript , IO altri effetti sono gestiti con la monografia Eff e gli effetti estensibili, che sono dichiarati in questo modo:

main :: Eff (trace :: Trace, random :: Random) {}

Quindi, se capisco bene, questa dichiarazione di main consente solo di accedere alla console e generare numeri casuali. trace :: Trace, random :: Random è una riga di effetti, ovvero una raccolta di effetti con etichetta non ordinata.

Ora capisco che Trace è un effetto e trace è la sua etichetta. Ma perché abbiamo bisogno di entrambi? Ha senso per i record come { foo::String, bar::String } ma non riesco a capire perché avrei bisogno di gestire due% di% di impatto con etichette diverse. cioè scriverò quanto segue:

main :: Eff (Trace, Random) {} -- no redundant labels

Le etichette degli effetti sono utili in purescript? Se sì, perché?

    
posta Simon 30.06.2014 - 10:00
fonte

2 risposte

6

La semplice risposta è che il macchinario per le righe esisteva già nel typechecker, sin dalla primissima versione del compilatore PureScript, quindi aveva senso riutilizzarlo per definire Eff monad. L'unica modifica era consentire alle righe di essere parametrizzate dal tipo di tipi indicizzati dalle loro etichette.

Sembra certamente che le etichette non siano necessarie, e lo sarebbero se gli effetti fossero solo simboli. Un'altra risposta, tuttavia, è che le etichette ci permettono di mantenere la proprietà desiderabile di avere la maggior parte degli unificatori generali nel sistema dei tipi.

Esempio contrived

Supponiamo di aver definito un gestore il cui tipo contenesse una riga di effetti con due o più variabili di tipo sconosciuto:

runFooBarEffects :: forall eff foo bar. Eff (foo :: foo, bar :: bar | eff) a -> Eff (combined :: Baz foo bar | eff) a

E un'azione corrispondente con tipi di effetti concreti:

myAction :: Eff (foo :: Foo, bar :: Bar, trace :: Trace) String

Quando proviamo a eseguire questa azione con runFooBarEffects myAction , il typechecker deduce correttamente il tipo di risultato Eff (combined :: Baz Foo Bar, trace :: Trace) String tramite unificazione.

Tuttavia, immagina se non ci fossero etichette presenti. L'algoritmo di unificazione non sarebbe in grado di procedere, poiché foo potrebbe essere unificato con Foo o Bar , poiché le righe non sono ordinate. Non c'è più un più generale unificatore per le due righe.

Questo esempio è in realtà artificioso, ma illustra il fatto che poiché non siamo limitati a tipi atomici (simboli) semplici che appaiono in righe, ma invece abbiamo un intero reticolo di tipi, abbiamo bisogno di etichette per mantenere sano il sistema dei tipi.

    
risposta data 01.07.2014 - 03:17
fonte
2

Non ho mai usato PureScript, ma la risposta breve è sì, le etichette effetto sono utili per la modellazione di effetti in modo basato su principi.

Non sono sicuro di quale sia il tuo background, quindi non so a quale livello rispondere alla domanda. Conoscete gli effetti collaterali, i lati negativi del loro uso illimitato, la programmazione funzionale e perché cerchiamo di evitare gli effetti collaterali in FP? Se è così, ciò fornisce una buona motivazione per i sistemi di effetti, che consentono di utilizzare effetti senza consentire il loro uso illimitato; in linguaggi tipizzati staticamente, è persino possibile tracciare esplicitamente gli effetti nel sistema di tipi. Un sistema di effetti popolare è i trasformatori monad (ovviamente sono non senza inconvenienti - ma hanno già implementati nelle lingue popolari e sono quindi facili da iniziare a sperimentare con).

Se capisci tutto questo, allora forse la tua domanda è semplicemente perché uno / vorrebbe più istanze separate dello stesso effetto? I generatori di numeri pseudo-casuali non generano numeri casuali e le relazioni tra i numeri generati non sono casuali - quindi con due (o più) effetti casuali separati, puoi essenzialmente avere due (o più) numeri pseudo-casuali non correlati ruscelli.

Dichiarazione di non responsabilità: non ho mai usato PureScript - questa è solo la mia opinione!

Perché uno / desidera più istanze separate dello stesso effetto? I generatori di numeri pseudo-casuali non generano numeri casuali e le relazioni tra i numeri generati non sono casuali - quindi con due (o più) effetti casuali separati, puoi essenzialmente avere due (o più) numeri pseudo-casuali non correlati ruscelli.

Un altro vantaggio dell'uso dei nomi - anche quando non c'è più di una singola istanza di un dato effetto - è che qualche significato semantico può essere associato agli effetti attraverso un'etichetta significativa. In altre parole, non tutti i State s sono creati uguali!

Un altro esempio di utilizzo di più istanze dello stesso effetto, controlla i combinatori di parser. Questi sono facili da costruire da sistemi di effetti come i trasformatori monad. Un semplice backtracking, un parser per la segnalazione degli errori potrebbe essere creato da:

  • Stato: gestisce la stringa di input
  • Errore - segnalazione degli errori
  • Forse - backtracking

effetti (mi dispiace, questa è la terminologia Haskell - Non so come quella mappa sugli effetti di PureScript). Se si desidera monitorare anche la posizione (riga, colonna) durante l'analisi, è possibile aggiungere un secondo effetto stato. Puoi anche tenere traccia delle dichiarazioni delle variabili globali usando un effetto di terzo stato (supponendo che tu stia analizzando un linguaggio di programmazione). Mentre in linea di principio si potevano combinare tutti e tre gli effetti di stato in uno solo, ciò avrebbe introdotto l'accoppiamento e sarebbe stato meno estendibile; averli separati evita questo accoppiamento.

    
risposta data 30.06.2014 - 22:11
fonte

Leggi altre domande sui tag