- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果状态被视为函数的坏主意,为什么在使用 MailboxProcessor 时将状态视为好的?
为了扩展,我正在向某人解释函数式编程,函数如何不使用状态(函数外部没有变量 - 即相同数据输出相同数据)以及这带来的好处。但是后来我开始考虑 MailboxProcessor 以及它使用递归在函数调用之间保持状态的方式,我无法理解为什么在这种情况下它没问题。
它是保持状态最不坏的方式吗?
最佳答案
邪恶真的是共享可变状态。在单线程情况下,共享可变状态意味着无法安全地组合函数 - 因为一次调用可以修改某些状态,然后第二次调用会读取该状态,因此您会得到意想不到的结果。在多线程情况下,共享可变状态意味着您有可能出现竞争条件。
函数式编程通常避免突变。函数仍然可以共享一些状态(例如闭包可以捕获一个状态),但它不能被改变。在单线程的情况下,也没有非确定性。在多线程情况下,您几乎可以在纯函数式风格中做的唯一一件事就是进行叉连接并行(和数据并行),它不需要可变状态并且是完全确定的。
基于代理的编程也避免了共享的可变状态,但方式不同。您有只能共享不可变消息的隔离代理。因此存在一些不确定性(因为它们通过发送消息进行通信),但它们仅交换不可变值。事实上,你甚至可以在代理内部使用可变状态——只要它不被共享,你仍然可以避免共享可变状态。
关于F# MailboxProcessor 和功能设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22963775/
如果状态被视为函数的坏主意,为什么在使用 MailboxProcessor 时将状态视为好的? 为了扩展,我正在向某人解释函数式编程,函数如何不使用状态(函数外部没有变量 - 即相同数据输出相同数据)
我一直在尝试设计一个允许大量并发用户同时在内存中表示的系统。在着手设计这个系统时,我立即想到了某种基于 Actor 的解决方案,类似于 Erlang。 该系统必须在 .NET 中完成,因此我开始使用
我一直在慢慢研究 F# 带来的所有功能。 MailboxProcessor 尤其引起了我的兴趣。 C# 中的等效项很可能会使用锁。我们能否将 MailboxProcessor 视为锁的替代品? 在下面
我刚刚在 F# 中发现了 MailboxProcessor,它被用作“状态机”……但我找不到太多关于它们的推荐用法。 例如......假设我正在制作一个有 100 个屏幕上敌人的简单游戏,我应该使用
我编码了“经典”bank account kata使用 F# MailboxProcessor 是线程安全的。但是当我尝试将交易并行添加到帐户时,速度非常慢非常快:10 个并行调用有响应(2 毫秒),
我是 F# 的新手,并尝试使用 MailboxProcessor 来确保状态更改是单独完成的。 简而言之,我将操作(描述状态更改的不可变对象(immutable对象))发布到 MailboxProce
我正在尝试使用 MailboxProcessor 对异步作业处理框架进行建模。我的要求是启动、停止、暂停和恢复作业处理器。我可以使用 MailboxProcessor 构建暂停/恢复功能吗?我也应该能
我认为这个问题涉及同一领域,但我看不出它如何适用于我的情况。 Generic reply from agent/mailboxprocessor? 这是背景。我有一些状态,现在只能说它只包含一个玩家列
我使用 http://fssnip.net/3K 中的代码创建了一个控制台程序.我发现 我想在末尾添加“System.Console.ReadLine() |> ignore”以等待线程完成。是否可以
看着: member this.PostAndReply : (AsyncReplyChannel -> 'Msg) * ?int -> 'Reply 我不明白为什么签名对我来说看起来如此违反直觉。我
我正在尝试编写一个非常简单的异步测试框架之类的东西。但我认为我遇到了某种限制或错误。抱歉,我无法在较小的代码库上重现此内容。 这是我想出的基本框架: module TestRunner ope
我不明白为什么以下代码卡在对 GetTotal 的调用中.我似乎无法在 MailboxProcessor 内部进行调试,因此很难看出发生了什么。 module Aggregator open Syst
我有一个命令定期运行 SFTP 检查并将结果记录到文件中。 let logPath = Path.Combine(config.["SharedFolder"],timestamp) let sw =
我想处理消息的类型 Add x 让程序记住数字 x Print 让它打印所有记住的数字 我为什么要这样写: open System type Message = | Add of int
我正在学习 F# 代理 (MailboxProcessor)。 我正在处理一个相当不寻常的问题。 我有一个代理 (dataSource),它是流数据源。数据必须由一组代理 (dataProcessor
当其 MailboxProcessor 被处理(或以其他方式停止)时,是否可以让 PostAndAsyncReply 立即返回?或者是否有一些关于如何安全地使用 PostAndReply 方法而不造成
我想按顺序处理一系列作业,但我想将这些作业并行排队。 这是我的代码: open System.Threading.Tasks let performWork (work : int) = task
我对下面的代码示例和人们的想法有点好奇。 这个想法是从 NetworkStream (~20 msg/s) 中读取数据,而不是在 main 中工作,而是将内容传递给 MainboxProcessor
基本上,我想将以下内容更改为有限的线程解决方案,因为在我的情况下,计算列表太大,产生了太多线程,我想用更少的线程进行实验和测量性能。 // the trivial approach (and larg
我坚持为使用 MailboxProcessor 的 F# 项目修复我的 TFS 测试运行。问题是我从 TFS 测试运行器收到的以下警告: System.AppDomainUnloadedExcepti
我是一名优秀的程序员,十分优秀!