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
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.
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