成为更好的F#程序员的途径

时间:2010-09-02 14:21:02

标签: f# functional-programming

我想听听那些已经达到F#(以及一般的函数式编程)熟练程度的人们,从现在开始我应该成为一名更好/专业的F#程序员? / p>

我已经了解了很多F#语法,并且拥有多年的C ++经验。我的目标是,作为工程师和数学家,设计更好的科学库(线性代数包,偏微分求解器等)。

7 个答案:

答案 0 :(得分:27)

  

从现在开始我的步骤应该是什么   成为更好/专业的F#   程序员?

每天保持编码:)

我在07年9月跳上F#列车,之前我有一大堆C#经验。我花了大约3个月左右的时间才停止用一些有趣的语法编写代码作为C#,并开始采用正确的编码风格:)

帮助我的提示和事项:

  • 我发现F#很难编写非惯用代码,真的很容易编写好的,干净的代码。如果你发现自己正在与编译器作斗争,那么你做错了9次就会有9次。回到绘图板再试一次。

  • 最初的不变性概念一直是个谜,但实现Okasaki的纯功能数据结构的所有数据结构非常有帮助。

  • 在工作的一些缓慢的日子里,在08年和09年之间,我写了a wikibook。我有一段时间没有看过它,但我确定它真的很糟糕 - 但是,向别人解释语言的经验对于像我这样通常没有足够动力开始的人来说是一个很好的快速启动F#中的宠物项目:)

  • 地图,折叠和过滤器是您的朋友。尝试在这些函数中表达算法,而不是使用递归实现循环。

  • 非尾递归函数几乎总是更容易读写。请参阅here

  • Project Euler。很多人推荐它,我没有发现它特别有用。但是,如果你是数学家,你可能会比我更多地使用它。

  • < 3个工会!使用它们!

  • 回到可变状态 - 大禁忌。至少对初学者来说。最糟糕的初学者代码充满了mutable和ref变量。不变性起初是一个外来概念,所以我建议暂时写完全无状态的程序。

尽管如此,最好的建议是每天保持编码。

希望有所帮助!

- 朱丽叶

答案 1 :(得分:6)

与任何其他语言一样,您现在知道语法和基础知识,是时候编写代码和更多代码了。

  • 确保您拥有core concepts of functional programming down
  • 在一个大项目上工作,这样你也可以熟悉大型项目而不仅仅是小项目。
  • 编写一些不可变的数据结构。
  • 在不使用继承的情况下处理大型项目。
  • 如果您熟悉design patterns以纯粹功能的方式实现其中一些,并注意其中一些消失。
  • F#是关于混合功能和OOP样式。一旦你完成了没有继承的抽象数量的抽象,就把它带回来并开始将这些样式混合在一起。找到一个平衡点。

由于您作为工程师和数学家的目标是设计更好的科学图书馆,因此我建议将其作为一项视频游戏风格模拟的学习练习。涉及物理和数学的东西,但也需要控制状态。

答案 2 :(得分:5)

我只能同意尝试向其他人解释函数式编程是学习它的好方法。我花了很多时间思考我的F#书的结构,我认为这真的帮助我理解了功能概念的相关性。即使在公司或朋友中就F#发表演讲也会产生类似的效果。

当我开始学习F#时,我开始研究F# WebTools项目。我认为这非常有用,因为项目的许多组件都非常适合函数式编程,所以我学到了许多功能技巧(因为它们是解决问题的最佳方法)。该项目处理了F#的源代码树并将其翻译为JavaScript,因此我使用了大量的递归函数和有区别的联合。

你工作的区域与我的区别很大,所以我不能给你任何具体的建议,但是以明确的功能方式编写程序是个好主意 - 即使你认为它看起来更好看你用C ++风格写的。当你编写它时,你可能会找到一些简化代码的方法。

所以,我认为我可以给出的提示是:

  • 尝试向其他人解释F# - 这有助于您在脑海中组织想法
  • 选择好的问题 - 例如算法问题,处理树结构等。
  • 尽可能多地写下F#,不要害怕从一个看起来不太合适的解决方案开始 - 我多次重写了我的第一个程序!

答案 3 :(得分:4)

你很可能不想听我的消息,因为我没有达到F#的高水平,但我已经为自己设定了目标(就像你的自己一样)。

我想我可能会建议我最大的学习工具:顽固性。

我把自己设定为一个大型项目(一个游戏,正如gradbot建议的那样)。然后我决定使用尽可能多的不可变数据进行编码,而不管性能成本如何。

然后,如果我找不到使用不可变数据的方法,我会来这里寻求帮助。

这种顽固的方法迫使我跳过的箍是一个很棒的学习练习,就像(正如朱丽叶提到的那样)F#允许你写出非常难看的C#,如果你让自己变得松懈。

现在我有基于瓷砖的2D世界和一个小男人,他可以找到他的方式去宝藏,并使用A *路径寻找再次回到家...我唯一突变的是它显示的窗口的标题

到7月底我才认真学习F#(我之前已经涉足过),这个项目教会了我很多,还有StackOverflow的帮助。

答案 4 :(得分:3)

其他答案很好地提出了练习F#写作技巧的方法,这显然非常重要。然而,似乎没有被强调的东西是阅读 F#代码,这在我看来同样重要。有很多人用F#做很酷的事情,了解语言不同角落的最好方法之一就是阅读他们正在做的事情。这将帮助您获得惯用的风格,并且还会让您了解更多的设计模式,语言功能和函数式编程技术,而不是您自己使用F#解决问题时可能遇到的问题。

Planet F#联合发布的F#博客是一个很好的起点,但也有一些关于该语言的优秀书籍和演示文稿。

答案 5 :(得分:3)

这只回答了你的部分问题,但是当你谈到想要用F#创建库时,F#组件设计指南就出来了:

http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/fsharp-component-design-guidelines.pdf

答案 6 :(得分:3)

如果您对科学图书馆感兴趣,建议您查看Jon Harrop的 F# for Scientists

另外,为了给你的数学家提供帮助,我建议你阅读Doets-Van Eijck The Haskell Road to Logic, Maths and Programming ,尽管用Haskell编写,你一定能够理解大部分文本,在F#中重新实现样本可能是一个很好的练习。