Elm:邮箱是如何工作的?

Elm: how does Mailbox work?

假设我使用 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.signalmailbox.address绑定,elm会自己搞定,因为地址和某种类型的信号是一一对应的?

邮箱将您发送给它的事件放入其信号的能力完全基于 "magic",也就是说,它是本机实现的(在 JavaScript 中),而不是您可以自己实现的东西.这就是为什么它内置在标准库中。

创建邮箱是一项必要且有效的操作(嘘,不要告诉任何人)。所以如果你使用:

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

这两个邮箱是不同的。向 mailbox2.address 发送消息会在 mailbox2.signal 而不是 mailbox1.signal 上产生消息。这破坏了引用透明性,这很糟糕,但目前它并没有破坏一切。 (这可能离题太远了,但是因为你需要 Signal 用于输出而不能有 Signal (Signal something),实际上邮箱创建的非托管效果并没有把事情搞砸)。此 "leak" 将在未来的某个时候修复。已经有一个提案,但在不同版本的语言中进行了重大更改。