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.signal
和mailbox.address
绑定,elm会自己搞定,因为地址和某种类型的信号是一一对应的?
邮箱将您发送给它的事件放入其信号的能力完全基于 "magic",也就是说,它是本机实现的(在 JavaScript 中),而不是您可以自己实现的东西.这就是为什么它内置在标准库中。
创建邮箱是一项必要且有效的操作(嘘,不要告诉任何人)。所以如果你使用:
mailbox1 = Signal.mailbox Blah
mailbox2 = Signal.mailbox Blah
这两个邮箱是不同的。向 mailbox2.address
发送消息会在 mailbox2.signal
而不是 mailbox1.signal
上产生消息。这破坏了引用透明性,这很糟糕,但目前它并没有破坏一切。 (这可能离题太远了,但是因为你需要 Signal
用于输出而不能有 Signal (Signal something)
,实际上邮箱创建的非托管效果并没有把事情搞砸)。此 "leak" 将在未来的某个时候修复。已经有一个提案,但在不同版本的语言中进行了重大更改。
假设我使用 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会自己搞定,因为地址和某种类型的信号是一一对应的?
邮箱将您发送给它的事件放入其信号的能力完全基于 "magic",也就是说,它是本机实现的(在 JavaScript 中),而不是您可以自己实现的东西.这就是为什么它内置在标准库中。
创建邮箱是一项必要且有效的操作(嘘,不要告诉任何人)。所以如果你使用:
mailbox1 = Signal.mailbox Blah
mailbox2 = Signal.mailbox Blah
这两个邮箱是不同的。向 mailbox2.address
发送消息会在 mailbox2.signal
而不是 mailbox1.signal
上产生消息。这破坏了引用透明性,这很糟糕,但目前它并没有破坏一切。 (这可能离题太远了,但是因为你需要 Signal
用于输出而不能有 Signal (Signal something)
,实际上邮箱创建的非托管效果并没有把事情搞砸)。此 "leak" 将在未来的某个时候修复。已经有一个提案,但在不同版本的语言中进行了重大更改。