F#可以教我很好的函数式编程实践吗?

时间:2010-11-22 02:25:01

标签: .net f# functional-programming c#-to-f#

我打算让自己沉浸在函数式编程范式中,让思维过程成为我的第二天性。 .Net / Mono是我熟悉的唯一框架/对象模型,我不想学习任何其他类型的系统。这使得F#显而易见,因为学习新型系统的负担不会是一个令人分心的因素。

但我关心的是语言本身。在将FP钻入我的头骨时,它是否与任何其他经典函数编程语言(例如Haskell)一样好?

5 个答案:

答案 0 :(得分:10)

是的,它可以。这里特别有用和密切关注的是Real World Functional Programming,来自C#,特别是F#视角的FP。你会爱上它。

答案 1 :(得分:9)

我认为使用F#学习函数式编程的好处(特别是如果你已经有过C#和.NET的经验),你会发现创建一些有趣的项目要容易得多。

  • 一个原因是您已经熟悉.NET库(易于从F#访问)
  • 第二个原因是F#不是纯粹的,所以你可以开始编写有效的代码,然后对其进行改进以使其更具功能性。

F#支持多种范例,但它主要是一种功能语言(与支持多种范例的Python或C#相比,但不具备主要功能)。这样可以更轻松地强制自己使用功能样式。避免命令式模式更容易,因为它们更难以用F#编写(并且代码看起来更糟)。

我认为,一旦你“掌握”基础功能编程,如果你仍然感兴趣,学习其他功能语言会更容易。对Haskell或Scheme有一点了解是非常好的,因为它们更激进(在某些方面)。

如果你擅长在一些实际项目中没有实际使用概念而擅长概念,那么使用一些经典书籍从一些经典语言开始也可能是一个不错的选择(例如Haskell School of ExpressionStructure and Interpretation of Computer Programs)。我并不是说任何消极的意义 - 我个人非常喜欢阅读技术书籍而不尝试例子,因为我仍然可以从阅读中获取有趣的概念(对于实践,总有谷歌)。当然,您可以在Haskell或Scheme中编写一些代码,但作为.NET程序员,您可能会发现编写F#代码更有趣......

答案 2 :(得分:4)

是的,它肯定会帮助您学习函数式编程。 F#也支持面向对象的编程,因此切换应该更容易。如果你想最终转向一个完整的功能语言,你可以,但我实际上发现OO和FP的组合比OO或FP更好(我是Scala程序员,就像F#)。

答案 3 :(得分:3)

在许多方面,F#可能比大多数“其他经典函数式编程语言”更好。既然您已经了解.NET,那么您将能够充分利用所有.NET知识,同时从F#中获取两个有用的东西:

  1. 功能编程范例。也就是说,如何以FP的风格进行编程。您可以使用任何语言。我经常在C#代码中学习FP,因为我发现它是一种更易于维护和可重用的软件编写方式。

  2. 一种语言的函数式编程语法。 F#与OCAML非常相似,ML系列构成了FP语言的3种主要方言之一。另外两个大家庭是米兰达家族(其中Haskell是主要的现代代表)和LISP家族(Common Lisp和Scheme是两个大代表)。

  3. 在F#中,它可以帮助您在F#类型和.NET类型之间进行非常清楚的区分。记录,元组和歧视联盟(几乎)纯粹是F#的东西,它们几乎用于所有功能语言。如果你想学习FP,可以使用这些。类,结构和接口也在那里,但那些是.NET概念。根据需要使用它们,但一般要尽量避免使用它们,以免你最终写出“用愚蠢的语法编写C#”而不是惯用的F#。

    你真正错过Haskell的东西是真正的纯度(呃,不是那么大的交易),默认的懒惰评价(一个很大的改变)和类型类。你可以在F#中做懒惰的eval,但你必须使用显式的Lazy<>获得它的课程。懒惰的eval无处不在是Haskell中真正独特而强大的东西之一,但它并不是一个严格的FP概念。类型类非常强大,但是对于大多数现实世界的情况,你可以在没有它们的情况下使用它们。它们只是一个更高层次的抽象,减少了一些锅炉板和重复。

    真正的纯洁通常更具学术性。它有一定的优势,但是如果你已经习惯了.NET并且使用了不纯的技术,那么在你完全接受FP思维模式之前,你大多只会觉得很难解决。

答案 4 :(得分:2)

功能编程范例?哈斯克尔立刻想到了。顺便说一下,Haskell中没有继承框架。据我所知,你的框架是一个终端窗口和一个编程编辑器。

如果你想要一个.NET框架中的函数式编程语言,你将不得不坚持使用F#。

IronPython,但方式不是函数式编程语言。