在与现实世界对话的应用程序中,使用非确定性函数是不可避免的。明确区分确定性和非确定性是很重要的。
Haskell有IO monad通过查看我们知道它之外的所有内容都是纯粹的来设置不纯的上下文。这很好,如果你问我,当谈到单元测试时,可以分辨出他们的代码的哪一部分最终是可测试的,哪些不是。
我找不到任何允许在F#中分离两者的东西。这是否意味着没有办法做到这一点?
答案 0 :(得分:5)
确定性和非确定性函数之间的区别不是由F#类型系统捕获的,但是需要处理非确定性的典型F#系统将使用一些明确区分两者的结构(或“设计模式”)
如果您的核心模型是一些不与世界交互的计算(您只需要收集输入并运行计算),那么您可以将大部分代码编写为不可变数据结构上的函数转换,然后从一些“主”I / O循环调用这些。
如果您正在撰写一些高度互动或反应性的应用程序,那么您可以使用F#代理(此处为an introductory article)并构建您的应用程序,以便将非确定性安全地包含在各个代理中(请参阅more about agent-based architectures)
答案 1 :(得分:2)
F#基于OCaml,与OCaml非常相似,它不是纯粹的FP。我不相信有任何一种语言可以实现你的目标。
答案 2 :(得分:0)
管理它的一种方法可能是构成一个代表现实世界概念的名义类型,并确保每个非确定性函数将其单例作为参数。这样所有相关函数都必须沿着它传递它。这使得两者之间的区别很大,但需要花费一些纪律和一些额外的打字。这种方法的好处在于它可以在编译器验证的情况下满足必要的条件。