2015-07-11 15 views
5

Say tworzę Mailbox użyciu mailbox = Signal.mailbox Action, gdzie type Action = Blah, później mogę wysłać działań do tej mailbox wykorzystaniem Signal.send mailbox.address Blah, to pozwala mi słuchać na mailbox.signal, w jaki sposób? W końcu typ Mailbox jest tylko aliasem {address : Signal.Address Action, signal : Signal.Signal Action}, ponieważ jest to wiąz, że istnieje tylko jeden sygnał dla określonego typu, więc w powyższym scenariuszu nie muszę przypisywać wiązowi wiązania się z mailbox.signal z mailbox.address, wiąz wyłoni się sam ze względu na zgodność jeden-do-jednego między adresem i sygnałem określonego typu?Elm: jak działa Mailbox?

Odpowiedz

6

Możliwość umieszczania w skrzynce pocztowej wysyłanych przez nią zdarzeń jest w całości oparta na "magii", czyli jest implementowana natywnie (w JavaScript), a nie czymś, co można zaimplementować samodzielnie. Dlatego jest wbudowany w standardowe biblioteki.

Tworzenie skrzynki pocztowej jest imperatywną, skuteczną akcją (cii, nie mów nikomu). Więc jeśli użyjesz:

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

te dwie skrzynki pocztowe będą odrębne. Wyślij wiadomość na numer mailbox2.address spowoduje wyświetlenie komunikatu na mailbox2.signal, ale nie będzie to mailbox1.signal. To przełamuje przejrzystość referencyjną, która jest zła, ale na razie nie wszystko zepsuje. (Może to zaszaleć do stycznej, ale ponieważ potrzebna jest Signal dla wyjścia i nie może mieć Signal (Signal something), w praktyce niezarządzany efekt tworzenia skrzynki pocztowej nie psuje rzeczy). Ten "wyciek" zostanie naprawiony w pewnym momencie w przyszłości. Była już propozycja, ale duże zmiany są wystawiane w różnych wersjach językowych.

+2

Jeśli wywołanie 'Signal.mailbox' dwukrotnie tworzy dwie różne skrzynki pocztowe, w jaki sposób działa kod w [Communicating with Mailboxes] (http://elm-lang.org/guide/reactivity), czyli' Signal.send contentMailbox. adres "cześć!" "działa? Ponieważ 'contentMailbox' jest wywoływany po raz drugi, powinien utworzyć inny sygnał, który nie jest tym, który jest używany w' main = Signal.map show contentMailbox.signal', gdzie jest nazywany po raz pierwszy, a zatem _ "hello" _ powinien nie wyświetla się? – RAbraham