首页 文章

成为更好的F#程序员的道路[已关闭]

提问于
浏览
13

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

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

7 回答

  • 3

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

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

  • 3

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

    另外为了你的数学家方面,我建议你阅读Doets-Van Eijck The Haskell Road to Logic, Maths and Programming ,尽管用Haskell编写,你肯定能够遵循大部分文本,并且在F#中重新实现样本可能是一个很好的练习 .

  • 5

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

    我想我可能会建议我最大的学习工具:固执 .

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

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

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

    现在我有基于瓦片的2D世界和一个小人,他可以找到他的方式去宝藏,然后再回到家里使用A *寻路...我唯一突变的是它所显示的窗口的 Headers .

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

  • 6

    从现在开始,我应该成为一名更好/更专业的F#程序员?

    每天保持编码:)

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

    提示和帮助我的事情:

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

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

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

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

    • 非尾递归函数几乎总是更容易读写 . 见here .

    • 项目欧拉 . 很多人推荐它,我没有发现它特别有用 . 但是,如果你是一位数学家,你可能会比我更多地使用它 .

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

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

    不过,最好的建议就是每天都要编码 .

    希望有所帮助!

    • 朱丽叶
  • 27

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

    • 确保您拥有core concepts of functional programming down .

    • 在一个大型项目上工作,这样你也可以熟悉大型项目,而不仅仅是小项目 .

    • 编写一些不可变的数据结构 .

    • 在不使用继承的情况下处理大型项目 .

    • 如果您熟悉design patterns以纯粹的功能方式实现其中一些,并注意其中一些消失 .

    • F#是关于混合功能和OOP样式 . 一旦你完成了没有继承的抽象数量的抽象,就把它带回来并开始将这些样式混合在一起 . 找到一个 balancer 点 .

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

  • 4

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

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

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

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

    • 尝试向其他人解释F# - 这对您有所帮助在你的脑海里组织想法

    • 选择好的问题 - 例如算法问题,处理树结构等

    • 尽可能多地写下F#并且不要害怕从一个看起来并不完美的解决方案开始 - 我重写了我的第一个程序这么多次!

  • 3

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

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

相关问题