2015-07-11 4 views
5

Скажем, я создать Mailbox используя mailbox = Signal.mailbox Action, где type Action = Blah, позже я могу отправить действия в этом mailbox с помощью Signal.send mailbox.address Blah, это позволяет мне слушать mailbox.signal, как же так? Я имею в виду, в конце концов, тип Mailbox - это просто псевдоним {address : Signal.Address Action, signal : Signal.Signal Action}, это потому, что в вязах есть только один сигнал для определенного типа, поэтому в приведенном выше сценарии мне не нужно указывать вяза для привязки mailbox.signal с mailbox.address, elm выяснит себя из-за взаимно однозначного соответствия между адресом и сигналом определенного типа?Elm: как работает почтовый ящик?

ответ

6

Способность почтового ящика размещать события, которые вы отправляете на него в свой сигнал, полностью основана на «магии», то есть реализована изначально (в JavaScript), а не в том, что вы могли бы реализовать самостоятельно. Вот почему он встроен в стандартные библиотеки.

Создание почтового ящика - это императивное, эффективное действие (shhh, не говорите никому). Поэтому, если вы используете:

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

эти два почтовых ящика будут отличаться. Отправить сообщение для mailbox2.address приведет к сообщению на mailbox2.signal, но не mailbox1.signal. Это нарушает ссылочную прозрачность, что плохо, но пока это не нарушает все. (Это может зайти слишком далеко в касательную, но потому, что вам нужно Signal для вывода и не может иметь Signal (Signal something), на практике неуправляемый эффект создания почтового ящика не возится). Эта «утечка» будет исправлена ​​в какой-то момент в будущем. Уже было предложение, но большие изменения были поставлены в разных версиях языка.

+2

Если вызов 'Signal.mailbox' дважды создает два разных почтовых ящика, как работает код в учебнике [Communicating with Mailboxes] (http://elm-lang.org/guide/reactivity), то есть' Signal.send contentMailbox. адрес "привет!" 'работа? Поскольку «contentMailbox» вызывается во второй раз там, он должен создать другой сигнал, который не используется в «main = Signal.map show contentMailbox.signal», где он вызывается в первый раз и, следовательно, «привет» _ должен не появляется? – RAbraham

Смежные вопросы