15

是否可以强制 F# 表现得像Haskell这样的纯函数式语言?也许使用一些编译器指令?

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

4

5 回答 5

12

你不能在 F# 中强迫这种行为,但正如 Brian 所说,纪律是你最好的朋友。例如,不要使用mutable,forwhile循环、ref关键字等。还要坚持使用纯粹不可变的数据结构(可区分的联合、列表、元组、映射等)。如果您需要在某些时候进行 IO,请构建您的程序,以便将它们与您的纯功能代码分开。

不要忘记函数式编程就是限制和隔离副作用。

于 2010-10-06T10:24:31.740 回答
10

不,谢谢。你只需要使用纪律。

于 2010-10-06T04:43:31.530 回答
4

如果你和我一样,如果你不强迫自己使用 Haskell 而不是 F#,并且尽可能地习惯性地使用 Haskell,你可能会避免“好东西”。使用代数数据类型而不是对象,学会爱懒惰,拥抱 monad 等等更多是 Haskell 的核心部分,并且可以说是纯函数式编程的一些更好的点(在我看来)。

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

深思熟虑。

于 2010-10-06T05:07:33.997 回答
2

Haskell 的纯功能方面是该语言的基础。你不能只是在语言之间移植它。它导致了重大的设计决策——例如,Haskell 的纯函数性质导致了 IO monad 的发明。F# 没有用于有状态计算的“逃生阀”。

此外,学习用一种支持函数式编程但并不绝对强制执行它的语言进行编程实际上可能是有益的。许多人对 Haskell 的个人设计决策(例如 IO monad,再次举个大例子)和函数式编程的一般工作方式感到困惑。

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

于 2010-10-06T05:08:08.327 回答
0

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

为什么不直接开始编写一些 F# 程序来学习函数式编程呢?我认识一些人,他们先学习了 ML/Ocaml/F#,然后转到了 Haskell。

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

于 2010-10-06T04:53:41.690 回答