2015-07-11 14 views
5

Dire creo un Mailbox utilizzando mailbox = Signal.mailbox Action, dove type Action = Blah, poi posso inviare le azioni a questo mailbox utilizzando Signal.send mailbox.address Blah, questo mi permette di ascoltare sulla mailbox.signal, come così? Voglio dire, dopo tutto, digitare Mailbox è solo un alias di {address : Signal.Address Action, signal : Signal.Signal Action}, è perché, in elm, c'è un solo segnale per un certo tipo, quindi nello scenario sopra, non devo dire a elm di legare mailbox.signal con mailbox.address, elm si scoprirà da solo a causa della corrispondenza uno a uno tra l'indirizzo e il segnale di un certo tipo?Elm: come funziona la cassetta postale?

risposta

6

La possibilità per la cassetta postale di inserire eventi nel suo segnale è interamente basata su "magia", vale a dire, è implementato in modo nativo (in JavaScript) e non qualcosa che è possibile implementare. Ecco perché è un built-in nelle librerie standard.

Creare una casella di posta è un'azione imperativa e efficace (shhh, non dirlo a nessuno). Quindi se si utilizza:

mailbox1 = Signal.mailbox Blah 
mailbox2 = Signal.mailbox Blah 

queste due cassette postali saranno distinte. Invia un messaggio a mailbox2.address darà come risultato un messaggio il mailbox2.signal ma non mailbox1.signal. Questo rompe la trasparenza referenziale, che è male, ma per ora non sta infrangendo tutto. (Questo può andare troppo lontano in una tangente, ma poiché è necessario Signal per l'output e non è possibile avere Signal (Signal something), in pratica l'effetto non gestito della creazione della casella di posta non è un problema). Questa "perdita" verrà risolta in futuro. C'era già una proposta, ma sono state apportate grandi modifiche in diverse versioni della lingua.

+2

Se chiamando 'Signal.mailbox' due volte crea due caselle di posta diverse, come funziona il codice nel tutorial [Comunicare con le cassette postali] (http://elm-lang.org/guide/reactivity), ad esempio' Signal.send contentMailbox. indirizzo "ciao!" 'lavoro? Poiché 'contentMailbox' è chiamato una seconda volta lì, dovrebbe creare un segnale diverso che non è quello usato in' main = Signal.map mostra contentMailbox.signal' dove viene chiamato una prima volta e quindi _ "ciao" _ dovrebbe non si presenta? – RAbraham

Problemi correlati