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