【问题标题】:How difficult is it to learn F# for experienced C# 3.0 developers?对于有经验的 C# 3.0 开发人员来说,学习 F# 有多难?
【发布时间】:2010-10-29 11:13:59
【问题描述】:

对于有经验的 C# 3.0 开发人员来说,学习 F# 有多难,和/或您认为学习 F# 最困难的部分是什么?

【问题讨论】:

  • 嘿马塞尔,我会对答案感兴趣。我能问一下你为什么想学它吗?只是好奇,还是您要解决的特定问题?我很好奇,但仍然不确定为什么我需要使用函数式语言....干杯
  • 我发现每次学习一门新语言,都会让我成为更好的 C# 开发人员。最近有很多关于 F# 的讨论,我已经觉得我正在用 C# 3.0 涉足功能性水域,所以这就是我对学习它感兴趣的原因(我只能在日常工作中使用 C# - 我'确定我不是唯一一个!)

标签: c# f# c#-3.0 functional-programming


【解决方案1】:

从 F# 开始(学习语法,了解如何以函数方式编程)并不难。熟悉 LINQ 并对 Lambda 表达式有深入了解的优秀 C# 3 开发人员应该能够快速掌握基础知识。

很难说打破面向对象解决问题的习惯对他们来说有多难,但需要函数式解决方案的问题应该迫使他们实现这一飞跃。除非我认为你遇到了一个新问题,否则很难改变你的想法。

总而言之,我花了一周的时间在业余时间(每晚 2-3 小时)学习语言的语法和基础知识。不过,您需要更多时间才能真正体验函数式编程。

问题

我仍在与类型作斗争。我一直在做 Project Euler 问题来自学语法,所以到目前为止我不需要任何复杂的用户定义类型。

编译器所做的类型推断也需要一点时间来适应,因为它并不总是很清楚何时需要指定类型,何时才能解决它们。

学习

我肯定会建议为初学者尝试Project Euler 问题。数学问题始终是函数式编程的理想选择。

总的来说,数据处理问题也很好。列表处理在函数式语言中非常简单,并且是您应该学习 IMO 的第一件事。

书籍

Real-world Functional Programming: 我不久前完成了这本书,发现它非常适合学习如何将函数式编程原理应用于使用 C# 和 F# 的问题。本书中的大多数示例都是用两种语言完成的,使用了每种语言特有的函数式编程习语并解释了它们之间的区别。

资源

【讨论】:

  • 很好 - 有没有什么特别的概念让你记忆深刻?
  • 我也想摆脱面向对象的习惯……你能举一个适合函数式编程的问题的例子吗?
  • @Marcel Lamothe:函数式语言是数学的好朋友。有些书会使用高阶函数、闭包、插值等术语......
  • @Neil Williams:你看过这个博客吗? codemiscellany.blogspot.com/search/label/f%23
  • 我在第一次学习 F# 时发现了 Project Euler,我很高兴使用它解决这些问题。做这些问题会给你很多使用各种管道功能的经验。然而,对于 F# 来说,这些问题有相当多的地方不会解决。
【解决方案2】:

对我来说,比较困难的部分之一是学习代数数据类型(可区分联合和元组)和模式匹配,因为我在其他语言中确实没有深入接触过这些概念。

至于加快速度,这是我的favorite online content for learning F#。由于您来自 C#,您可能会发现 'what does this C# code look like in F#' 很有用。

【讨论】:

  • 感谢您为您实际指定最困难的部分!
  • F# 中的模式匹配是否与正则表达式或 XPath 有很大不同?
  • 作为我自己的参考,可区分联合类似于 C++ 中的联合或 VB 中的变体,除了它们是强类型的。
  • 回答我自己关于模式匹配的问题 - 该结构类似于 C# switch 语句,但能够打开表达式,而不仅仅是常量。非常强大!
  • @Marcel - 正如您所说,match 表达式类似于 switch 语句,但它不是您可以使用模式匹配的唯一地方。例如,let x,y = someTuple 在赋值过程中使用模式匹配将元组分解为各个部分。
【解决方案3】:

正如其他答案所述,问题不在于 C# 与 F#,而在于面向对象/过程与功能。

话虽如此,如果您涉足过 Linq、lambdas、匿名委托,那么您已经在做一些函数式和/或函数式启发的东西,所以“函数作为变量”的第一个障碍已经过去了。

有一本书我非常期待 (Functional Programming in the Real World)*,因为它用 C# 和 F# 示例解释了函数式编程。我彻底推荐this webcastauthor,我认为这是一个优秀的品酒师。他向您介绍了一个过程 C# 中的示例,然后将其转换为函数式 C#,然后跳到过程式 F# 中做同样的事情,然后是函数式 F#。很不错。

对我来说最困难的事情是破译神秘的类型推断错误消息,尽管他们显然正在努力改进这一点。

旁注,关于 Stack Overflow 的 F# 问题相当多,但是搜索找不到searchword f#”,你必须搜索 "searchword [f#]"

*其中co-author/editor为社区所熟知;)

【讨论】:

【解决方案4】:

您可以快速学习 F#,但问题是您将如何在其中编程。

F# 可以让你像 C# 一样编写过程代码,但它更麻烦,而且你会错过函数式语言的要点。

根据我自己的经验,您将不得不丢弃您的可信赖循环以换取列表推导。您还必须学习使用嵌套函数和递归。

模式匹配也有一些陷阱需要警惕。

【讨论】:

    【解决方案5】:

    您可能会很快学习 F# 语言,但要按照应有的方式使用 F# 肯定需要一些时间。这可能类似于您从 C 到 C++ 的跳跃,只是增加了一种对眼睛来说陌生的语法和对大脑来说陌生的思维方式。

    【讨论】:

      【解决方案6】:

      我想说的是,在深入研究 F# 之前,先试试 Lisp 或 Haskell,或者两者兼而有之。在对 Lisp 和 Haskell 有一些经验,并长期虔诚地使用 C# 之后,我对 F# 感到宾至如归。再说一次,我在 OCaml(F# 背后的主要影响之一)方面也有一些经验,所以这有很大帮助。函数式语言是用数学和科学方法看待事物的一种完全不同的方式。添加 C# 中可用的 .NET 库的强大功能,这些库是您之前有经验的,而且您很出色。

      【讨论】:

      • 嘿,但是我必须学习 Lisp/Haskell 和 F# - 为什么不只学习 F# =)
      • 不学,看几页教程看看怎么用。以后你会感谢我的。
      【解决方案7】:

      如果你想学习F#,你需要熟悉Reflector或者至少阅读IL代码。

      F# 做了很多表面上没有意义的奇怪事情。例子:

      • 您有三种空值。 CLR null、Nullable 和 Option。
      • 它们可以组合使用。如果您看到 Option,您需要在使用字符串之前检查 None 和 Some(null)。
      • 您可以重载大多数运算符,例如加法 (+)、连接 (^) 和大于 (>)。
      • 其他语言会在您的库中识别这些重载。
      • 您不能使用 F# 中的重载连接运算符。
      • 如果您使用 > 运算符,它不会支持您的重载。相反,它会寻找 IComparable 接口。
      • 编译器不会告诉您使用 > 而不实现 IComparable 将是运行时错误。

      简而言之,F# 是一种极其不一致的语言,如果不深入研究它产生的代码,就无法真正理解它。

      【讨论】:

        【解决方案8】:

        对于有经验的 C# 3.0 开发人员来说,学习 F# 有多难,

        真的很简单。学习 F# 1 个月后,您应该能够认真工作了。

        和/或您认为学习 F# 最困难的部分是什么?

        首先,学习使用记录和联合类型以及模式匹配来代替类。其次,学习使用一流的函数更积极地分解代码。

        不过,这些都是小问题。拿起任何一本不错的 F# 书籍,你就会很快地了解它们。然后你就可以开始真正多汁的东西线并行和异步工作流和......

        【讨论】:

          【解决方案9】:

          最大的飞跃将是以下事实:

          C# 是一种面向对象的编程语言

          F# 是一种函数式编程语言

          不熟悉函数式编程的开发人员需要了解两者的区别以及如何在两者之间进行转换。好消息是 F# 是 .NET 框架的一部分……许多熟悉的库都将在那里。

          【讨论】:

          • 这根本不能回答问题!它重申了它。
          • 这更像是一种功能性与命令性的东西。 F# 的一个有趣之处在于它是混合的。您可以使用命令式风格在 F# 中编程。
          猜你喜欢
          • 2010-09-26
          • 1970-01-01
          • 2011-01-01
          • 1970-01-01
          • 2010-09-27
          • 2015-01-17
          • 2011-01-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多