3

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

Haskell 有一个 IO monad,它通过查看我们知道它之外的一切都是纯的来设置不纯的上下文。这很好,如果你问我,当涉及到单元测试时,你可以知道他们的代码的哪一部分最终是可测试的,哪一部分不是。

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

4

3 回答 3

5

F# 类型系统没有捕捉到确定性和非确定性函数之间的区别,但是需要处理非确定性的典型 F# 系统会使用某种结构(或“设计模式”)将两者明确分开。

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

  • 如果您正在编写一些高度交互或反应性的应用程序,那么您可以使用 F# 代理(这里是一篇介绍性文章)并构建您的应用程序,以便将不确定性安全地包含在各个代理中(请参阅有关基于代理的架构的更多信息

于 2013-09-30T22:13:53.807 回答
2

F# 基于 OCaml,与 OCaml 很相似,它不是纯 FP。我不相信用任何一种语言都可以实现你的目标。

于 2013-09-30T20:59:44.713 回答
0

管理它的一种方法可能是组成一个代表现实世界概念的名义类型,并确保每个非确定性函数都将其单例作为参数。这样,所有依赖函数都必须沿线传递它。这以一些纪律和一些额外的打字为代价在两者之间做出了强烈的区分。这种方法的好处是它可以在满足必要条件的情况下由编译器验证。

于 2013-10-01T02:11:31.127 回答