为经验丰富的C#3.0开发人员学习F#有多难?

时间:2009-05-28 02:13:58

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

为经验丰富的C#3.0开发人员学习F#有多难,和/或你认为学习F#最困难的部分是什么?

9 个答案:

答案 0 :(得分:17)

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

很难说他们打破面向对象解决问题的习惯是多么困难,但需要功能性解决方案的问题应该迫使他们实现这一飞跃。除非你在我看来遇到一个新问题,否则很难改变你的想法。

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

问题

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

编译器所做的类型推断也需要稍微习惯一下,因为当它需要指定类型时,以及何时可以解决它们时,并不总是很清楚。

学习

我肯定会建议为初学者尝试Project Euler个问题。数学问题总是适合函数式编程。

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

图书

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

资源

答案 1 :(得分:14)

对我来说,其中一个比较困难的部分是学习代数数据类型(有区别的联合和元组)和模式匹配,因为我真的没有在其他语言中遇到过这些概念。

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

答案 2 :(得分:4)

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

话虽如此,如果你涉足Linq,lambdas,匿名代表,你已经做了一些功能性和/或功能性的东西,所以“作为变量的功能”的第一个障碍就在你身后。

管道中有一本书(Functional Programming in the Real World)*我非常期待,因为它解释了使用C#和F#示例的函数式编程。我完全推荐this webcast author,我认为这是一个非常好的品尝者。他带您了解程序C#中的一个示例,然后将其转换为函数C#,然后在程序F#中执行相同操作,然后执行函数F#。很好。

对我来说最困难的事情是破译隐藏式的推理错误信息,尽管显然他们正在努力改进这一点。

旁注,堆栈溢出有很多F#问题,但是你无法通过搜索searchword f#”找到它们,你必须搜索searchword [f#]

*其中co-author/editor对社区而言是众所周知的;)

答案 3 :(得分:3)

你可以快速学习F#,但问题是你将如何编程。

F#可以让你编写像C#这样的程序代码,但它更麻烦,你会忽略功能语言的重点。

根据我自己的经验,你将不得不抛弃你可靠的循环以换取列表理解。您还必须学习使用嵌套函数和递归。

对于模式匹配,还有一些陷阱需要警惕。

答案 4 :(得分:2)

你可能会非常快地学习F#语言,但它肯定需要一些时间来使用它应该使用的方式。它可能类似于你从C到C ++的跳跃,增加了对大脑异常的眼睛和心态的语法。

答案 5 :(得分:2)

我先说,在钻研F#之前先用一点Lisp或Haskell,甚至两者。在Lisp和Haskell之前有过一些经验,并且在很长一段时间内使用C#后,我感到宾至如归。然后我还有一些OCaml的经验(F#背后的主要影响之一),所以这有助于相当数量。功能语言是一种完全不同的方式,用数学和数学来看待事物。科学方法。添加C#中提供的.NET库的强大功能,您之前有过这方面的经验,而且您很高兴。

答案 6 :(得分:1)

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

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

  • 您有三种null。 CLR null,Nullable和Option。
  • 他们可以合并。如果看到Option,则在使用字符串之前需要检查None和Some(null)。
  • 您可以重载大多数运算符,例如加法(+),连接(^)和大于(>)。
  • 其他语言会识别您库中的这些重载。
  • 您可以使用来自F#的重载连接运算符。
  • 如果您使用>操作员,它不尊重你的过载。相反,它会查找IComparable接口。
  • 编译器不会告诉您使用>没有实现IComparable将是一个运行时错误。

简而言之,F#是一种令人难以置信的不一致的语言,如果不深入研究它产生的代码,你就无法真正理解它。

答案 7 :(得分:1)

  

为经验丰富的C#3.0开发人员学习F#有多难,

真的很容易。学习F#后1个月你应该能够认真工作。

  

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

首先,学习使用记录和联合类型以及模式匹配而不是类。其次,学习使用一流函数更积极地对代码进行分解。

但这些都是小问题。拿起关于F#的任何体面的书,你会很快就找到它们。然后你就可以开始真正多汁的东西线并行和异步工作流程......

答案 8 :(得分:-1)

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

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

F#是函数式编程语言

不熟悉功能编程的开发人员需要了解差异是什么以及如何在两者之间进行转换。好的一点是,F#是.NET框架的一部分......所以很多熟悉的库都会出现在那里。