如果状态被视为函数的坏主意,为什么在使用 MailboxProcessor 时将状态视为好的?

为了扩展,我正在向某人解释函数式编程,函数如何不使用状态(函数外部没有变量 - 即相同数据输出相同数据)以及这带来的好处。但是后来我开始考虑 MailboxProcessor 以及它使用递归在函数调用之间保持状态的方式,我无法理解为什么在这种情况下它没问题。

它是保持状态最不坏的方式吗?

最佳答案

邪恶真的是共享可变状态。在单线程情况下,共享可变状态意味着无法安全地组合函数 - 因为一次调用可以修改某些状态,然后第二次调用会读取该状态,因此您会得到意想不到的结果。在多线程情况下,共享可变状态意味着您有可能出现竞争条件。

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

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

关于F# MailboxProcessor 和功能设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22963775/

10-10 21:36