F# MailboxProcessor 和函数式设计

8
如果状态被视为函数的不良想法,为什么在使用MailboxProcessor时拥有状态被认为是可以接受的?
具体来说,我正在向某个人解释函数式编程,如何不使用状态(没有函数外变量 - 即相同数据输入将得到相同数据输出)以及这带来的好处。但是,当我开始思考MailboxProcessor和它使用递归来持久化函数调用之间的状态时,我无法完全解决为什么在那种情况下使用状态是可以接受的。
这是因为这是最少不良的保持状态的方法吗?
1个回答

14

问题在于共享的可变状态。在单线程情况下,共享的可变状态意味着函数不能安全地组合——因为一次调用可能会修改某些状态,然后被第二次调用读取,这样你就会得到意外的结果。在多线程情况下,共享的可变状态意味着你有潜在的竞态条件。

函数式编程通常避免使用突变。函数仍然可以共享一些状态(例如闭包可以捕获状态),但它不能被突变。在单线程情况下,也没有非确定性。在多线程情况下,纯函数式风格几乎唯一可以做的事情就是进行 fork-join 并行(和数据并行),它不需要可变状态,并且是完全确定性的。

基于代理的编程也避免了共享的可变状态,但方式不同。你有孤立的代理,只能共享不可变的消息。所以有些非确定性(因为它们通过发送消息进行通信),但它们只交换不可变的值。实际上,你甚至可以在代理内部使用可变状态——只要它不是共享的,你仍然避免了共享可变状态。


有关Actor状态和非确定性的更多信息,请点击此处:这里这里 - eulerfx

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