Elm:Mailbox如何工作?

5
假设我使用mailbox = Signal.mailbox Action 创建一个 Mailbox,其中 type Action = Blah,那么以后我就可以使用 Signal.send mailbox.address Blah 向这个 mailbox 发送操作,并且可以通过监听 mailbox.signal 来实现相应的功能,为什么呢?毕竟,类型 Mailbox 只是一个 {address : Signal.Address Action, signal : Signal.Signal Action} 的别名。难道是因为在 elm 中,对于某种类型只有一个信号,所以上述场景中,我不需要告诉 elm 如何将 mailbox.signal 绑定到 mailbox.address,elm 会自己解决,因为地址和信号之间存在一对一的对应关系吗?
1个回答

6

邮箱能够将您发送的事件放入其信号中完全基于“魔法”,也就是说,它是在本地(使用JavaScript)实现的,而且不是您可以自行实现的。这就是为什么它是标准库中内置的原因。

创建一个邮箱是一种命令式、有副作用的操作(嘘!不要告诉任何人)。所以如果您使用:

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

这两个邮箱将是不同的。发送消息到mailbox2.address将在mailbox2.signal上产生一条消息,但不会在mailbox1.signal上产生消息。这破坏了引用透明度,这很糟糕,但目前它并没有破坏一切。(这可能会太离题了,但由于需要Signal进行输出,而不能有Signal(Signal something),因此邮箱创建的未管理效果并没有搞砸事情)。这个“泄漏”将在未来的某个时候得到解决。已经提出了一个建议,但大的更改被分阶段放在语言的不同版本中。


2
如果调用 Signal.mailbox 两次会创建两个不同的邮箱,那么 与邮箱通信 教程中的代码 Signal.send contentMailbox.address "hello!" 是如何工作的呢?因为在那里第二次调用了 contentMailbox,所以它应该创建一个不同的信号,而不是在 main = Signal.map show contentMailbox.signal 中第一次调用时使用的那个信号,因此 "hello" 不应该出现。 - RAbraham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接