榆树:邮箱是如何工作的?

Not*_* ID 5 elm

说我创建一个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,榆树由于某种类型的地址和信号之间的一对一对应,我们会弄明白吗?

Apa*_*hka 6

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

创建邮箱是一项势在必行,有效的行动(嘘,不要告诉任何人).所以如果你使用:

mailbox1 = Signal.mailbox Blah
mailbox2 = Signal.mailbox Blah
Run Code Online (Sandbox Code Playgroud)

这两个邮箱将是截然不同的.发送消息mailbox2.address将导致消息开启mailbox2.signal但不是mailbox1.signal.这打破了参考透明度,这很糟糕,但现在它并没有打破一切.(这可能太过于切入,但是因为你需要Signal输出而不能拥有Signal (Signal something),实际上邮箱创建的非托管效果并没有弄乱事情).这种"泄漏"将在未来的某个时刻得到修复.已有提案,但在不同版本的语言中进行了重大更改.

  • 如果两次调用`Signal.mailbox`创建两个不同的邮箱,那么[与邮箱通信](http://elm-lang.org/guide/reactivity)教程中的代码如何,即`Signal.send contentMailbox.address"你好"工作?由于`contentMailbox`在那里被第二次调用,它应该创建一个不同的信号,这个信号不是在`main = Signal.map show contentMailbox.signal`中使用的信号,在那里它被称为第一次,因此_"hello"_应该没出现? (2认同)