Fsh*_*ete 7 f# functional-programming mailboxprocessor
如果状态被认为是函数的坏主意,为什么在使用MailboxProcessor时它被视为没有状态?
为了扩展,我向某人解释函数式编程,函数如何不使用状态(函数外部没有变量 - 即相同数据的相同数据)以及这带来的好处.但后来我开始考虑使用MailboxProcessor以及它使用递归来在函数调用之间保持状态的方式,而且我不能完全调和为什么在这种情况下它是可以的.
这是持久状态最不好的方式吗?
Tom*_*cek 13
邪恶真的是共享的可变状态.在单线程情况下,共享可变状态意味着函数无法安全组合 - 因为一个调用可以修改某个状态,然后由第二个调用读取,因此您将获得意外结果.在多线程情况下,共享可变状态意味着您有可能出现竞争条件.
功能编程通常避免突变.函数仍然可以共享一些状态(例如,闭包可以捕获一个状态),但它不能被变异.在单线程情况下,也没有非确定性.在多线程的情况下,在纯函数风格中你唯一可以做的就是做fork-join并行(和数据并行),它不需要可变状态并且是完全确定的.
基于代理的编程也避免了共享的可变状态,但是以不同的方式.您有隔离的代理只能共享不可变消息.因此存在一些非确定性(因为它们通过发送消息进行通信),但它们只交换不可变的值.实际上,您甚至可以在代理中使用可变状态 - 只要它不共享,您仍然可以避免共享可变状态.