说我创建一个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,榆树由于某种类型的地址和信号之间的一对一对应,我们会弄明白吗?
邮箱将您发送给它的事件放入其信号的能力完全基于"魔术",即它是本地实现的(在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),实际上邮箱创建的非托管效果并没有弄乱事情).这种"泄漏"将在未来的某个时刻得到修复.已有提案,但在不同版本的语言中进行了重大更改.