F# 使用F的纯泛函#

F# 使用F的纯泛函#,f#,functional-programming,pure-function,F#,Functional Programming,Pure Function,有没有可能强迫F#像一个纯函数式语言那样工作?也许使用一些编译器指令 PS:由于我来自C/C++背景,我想强迫自己学习函数式编程而不学习Haskell:)不,对不起。您只需使用规程。否。目前F#编译器无法执行此检查 为什么不开始编写一些F#程序来学习函数式编程呢?我认识一些人,他们先学习了ML/Ocaml/F#,然后搬到哈斯克尔 然后你会对纯洁有更好的理解。(如果你以前真的没有接触过任何函数式编程语言,那么你对纯函数式的理解可能是肤浅的。)如果你和我一样,如果你不强迫自己使用Haskell而不是

有没有可能强迫F#像一个纯函数式语言那样工作?也许使用一些编译器指令


PS:由于我来自C/C++背景,我想强迫自己学习函数式编程而不学习Haskell:)

不,对不起。您只需使用规程。

否。目前F#编译器无法执行此检查

为什么不开始编写一些F#程序来学习函数式编程呢?我认识一些人,他们先学习了ML/Ocaml/F#,然后搬到哈斯克尔


然后你会对纯洁有更好的理解。(如果你以前真的没有接触过任何函数式编程语言,那么你对纯函数式的理解可能是肤浅的。)

如果你和我一样,如果你不强迫自己使用Haskell而不是F,并且尽可能习惯地使用Haskell,你可能会避免使用“好东西”。使用代数数据类型而不是对象,学会热爱惰性,接受单子等等,这些都是Haskell的核心部分,在我看来,这些都是纯函数式编程的优点

F#在很多方面都没有那么陡峭的学习曲线,但你听起来好像是为了好玩而学习,所以为什么不挑战一下自己呢?我可以证明,在使用Haskell之后,使用F#可以让您更好地了解F#通常应该如何使用


思想食粮。

哈斯克尔的纯功能方面是语言的基础。你不能只是在不同语言之间移植它。它导致了重大的设计决策——例如,Haskell纯粹的功能性导致了IO单子的发明。F#没有这样一个用于状态计算的“安全阀”

此外,学习用一种支持函数式编程但不能完全强制执行的语言编程实际上可能是有益的。许多人对Haskell的个人设计决策(如IO monad,再次点击大示例)和函数式编程的总体工作原理感到困惑


简言之:不,你不能这样做。但是你可以做的是非常仔细地观察和质疑你所做的一切,包括维护状态和排序操作,以确保你没有遗漏更纯粹的抽象。

你不能在F#中强制这种行为,但正如Brian所说,纪律是你最好的朋友。例如,不要使用
mutable
for
而使用
循环、
ref
关键字等。也要坚持使用纯粹不变的数据结构(区分的并集、列表、元组、映射等)。如果您需要在某个时刻执行IO,请设计您的程序,使其与纯功能代码分离


别忘了函数式编程就是限制和隔离副作用。

你能做到吗?你必须为你通常所做的任何有副作用的事情(如I/O)创建monad。@Gabe:除了Haskell的monad系统之外,还有其他的IO模型,尽管这是我听说过的灵活性和简单性之间的最佳折衷(足够令人惊讶)。如果你想读一些关于这个主题的非常深入的推理,你可能会有兴趣读西蒙·佩顿·琼斯的《笨拙的小队》论文。你是说F#有一个纯功能的I/O原语,它不是单子?或者,无论您实现什么样的I/O,都不必是单子?F#没有纯粹的功能性I/O原语——它使用有效的函数和按值调用。是的,除了单子之外,还有其他方法来实现纯功能IO。看看笨拙的队报,为什么不学习哈斯克尔呢?它的语法几乎是F#的一个子集,有了Haskell的知识,F#将是小菜一碟。可能的副作用:你会讨厌F#。“别忘了函数式编程是关于限制和隔离副作用的。”-或者代表它们,这样它们就不再是“副作用”:“别忘了函数式编程是关于限制和隔离副作用的”-至少对我来说,它还涉及到如何正确定义类型,从而使无效状态变得不可表示。您可以在其他语言(如C++)中实现这一点,但F#和其他函数式语言的类型系统使这一点更容易实现。