F#能为管理不确定性提供什么?

F#能为管理不确定性提供什么?,f#,purely-functional,F#,Purely Functional,在与现实世界对话的应用程序中,使用非确定性函数是不可避免的。明确区分确定性和非确定性是很重要的 Haskell有一个IO单子,它通过观察我们知道它之外的一切都是纯净的来设置不纯净的环境。这很好,如果你问我的话,当涉及到单元测试时,你可以知道他们的代码的哪一部分最终是可测试的,哪一部分不是 我找不到任何东西可以在F#中将两者分开。这是否意味着没有办法做到这一点?F#基于OCaml,与OCaml非常相似,它不是纯FP。我认为用这两种语言都无法实现你的目标 确定性和非确定性功能之间的区别不是F#型系统

在与现实世界对话的应用程序中,使用非确定性函数是不可避免的。明确区分确定性和非确定性是很重要的

Haskell有一个IO单子,它通过观察我们知道它之外的一切都是纯净的来设置不纯净的环境。这很好,如果你问我的话,当涉及到单元测试时,你可以知道他们的代码的哪一部分最终是可测试的,哪一部分不是


我找不到任何东西可以在F#中将两者分开。这是否意味着没有办法做到这一点?

F#基于OCaml,与OCaml非常相似,它不是纯FP。我认为用这两种语言都无法实现你的目标

确定性和非确定性功能之间的区别不是F#型系统所能捕捉到的,而是需要处理非确定性的典型F#系统将使用某种结构(或“设计模式”)来明确区分两者

  • 如果您的核心模型是一些不与外界交互的计算(您只需要收集输入并运行计算),那么您可以将大部分代码编写为不可变数据结构上的函数转换,然后从一些“主”I/O循环调用它们

  • 如果您正在编写一些高交互性或反应性的应用程序,那么您可以使用F#agents(如下所示)并构造您的应用程序,以便将非确定性安全地包含在各个代理中(请参阅)


管理它的一种方法是构造一个代表真实世界概念的标称类型,并确保每个非确定性函数都将其单例作为参数。这样,所有依赖函数都必须沿线路传递它。这使得两者之间有了很大的区别,但需要花费一些技巧和一些额外的输入。这种方法的优点是,只要满足必要的条件,编译器就可以对其进行验证。

虽然这不是一个“坏”问题,但它可能更适合CS堆栈。您可以使用列表对非确定性进行建模,因此它不必与杂质有关。IO用于模拟有副作用的计算,虽然您可以在F#中创建自己的IO实现,但它可能没有多大用处,因为任何函数都可能有副作用。@Lee,请原谅我的无知,列表如何帮助对非确定性进行建模?@bonomo-您可以使用列表来包含某些非确定性选择的所有可能值。您可以将所有非确定性都封装在计算表达式中。这对我来说似乎是一个很大的工作,但仍然有可能。。。