这些天我正在认真学习函数式编程.
虽然我对Haskell以及它似乎提供的可能性感到非常兴奋,但我现在也可以看到它需要一段时间来学习.在如何学习Haskell的SO问题中,一个答案表明,实际上"掌握"它需要几个月甚至几年.
现在,我知道C,PHP,一些面向对象的东西等等.并且被告知Haskell在"现实世界"中没有被广泛使用,我会更好地提高我所熟悉的常规语言的技能吗?哈斯克尔值得奋斗吗?
在这个问题上为什么人们认为函数式编程会得出结论似乎是函数式编程将"流行".但是程序编程肯定会保持领先,对吧?
编辑:keparo很好地澄清了我的问题:与过程语言相反,研究Haskell和函数式编程范例对我来说是否有价值?
Haskell并不像人们想要学习那么难.Haskell打开了一个你从未知道的新世界.学习它和任何其他语言一样有价值.您可能找不到要求您进行Haskell编程的工作,但这是否真的意味着语言没有价值?
Haskell会教你很多新东西,它会告诉你如何用你/做/用的语言更好地编程.您可以在业余时间使用它来完成自己的个人项目.
如果将"现实世界"定义为"现金生成器",Haskell在"现实世界"中的用处并不多.因此,如果这是您的目标,那么您可能需要重新考虑目标:p
另外,我真的不喜欢那部分选择"如何学习haskell"的答案.掌握任何语言需要几个月到几年,而不仅仅是Haskell.取决于您如何定义"主".我可以使用Haskell达到相当高的效率,而且我只学习了一个月,而且我一直在慢慢地学习它.
如果不出意外,学习Haskell提供的思维方式的改变将在您必须回到使用仍在工作场所中使用的那些程序语言时帮助您.
功能范例开始进入各种主流应用程序和语言 - 甚至C++也将在C++ 0x中添加一个(残缺的)lambda.
您可能还想查看一些混合语言,如Scala或OCaml.Scala正在Twitter上使用,而OCaml正在Jane's Street的金融交易平台上使用.
你可能不应该期望在专业环境中使用Haskell几乎与C系列语言一样频繁.如果问题是对你研究Haskell和函数式编程范例是否有价值,答案是肯定的.您可以将对编程的丰富理解应用到您的所有工作中.
我学习了Haskell,因为它是迄今为止我用Scala,Clojure,OCaml和Scheme尝试过的最好的函数式语言,但我并没有真正期望将它用于工作.
事实证明,对于那些对团队来说太小而且在Java中过于耗时的奇怪工作来说,它是完美的.到目前为止,我已经将它用于ad-hoc数据迁移,即将CSV导出转换为另一种格式,XML的批量转换(HXT比XSLT更简洁,更强大),屏幕抓取互联网和软件项目估算,包括建模风险使用概率monad并使用回溯产生最佳甘特图.这都是需要做的真正工作,我甚至不愿意尝试用Java做,因为这将是一项多日工作.
我现在使用它而不是Excel来进行任何模糊的数学运算,因为在文本编辑器中创建haskell源中的值列表比在Excel中键入值更加努力.一旦进入haskell,我就可以做各种各样的魔法,比如Excel不能做的回溯,概率分布等.如果我需要图表,那么我将值吐出为CSV(2行代码)并将它们加载到Excel中.
唯一的缺点是需要几个月才能熟练,但值得努力恕我直言.
与过程语言相反,研究Haskell和函数式编程范例对我来说是否有价值?
如果拥有扩展的技能组合是有价值的,那么:是的.
您可能会获得的一个优势:并行和并发编程.过去的程序语言往往没有明确的副作用概念,因此在其中编写并行程序很难正确执行.功能语言(特别是那些限制像Haskell这样的副作用的语言)对于高效的并行编程有更多的说法.
拥有这种技能不会伤害你.
我可以看到,如果非功能性代码非常容易使用,那么函数式编程在生产环境中可能是一个优势.当我们想出F#时,MS也可以看到它.
由于它们都编译为IL,因此您可以处理要求功能方法功能的问题,并在程序代码中非常轻松地使用这些解决方案.
通过这种方式,功能代码可以轻松地在生产环境中一次找到它的方式
因此,既然MS的用户群很大,我的猜测是如果F#在不久的将来不会流行,那么Haskell也不会.
我认为这值得斗争.它将帮助您了解问题是如何解决的,而不仅仅是计算机的工作原理.
也许一个特殊的问题是Haskell本身 - 作为一种纯粹的功能性语言,它有点"硬核",另一方面可能使事情复杂化.
相反,函数式编程可能非常实用 - 许多OO /命令式语言现在已经包含了功能元素(Linq,匿名函数,只读值,函数指针/委托,类型推理):你可以专注于什么应该做的,它允许你用更少的代码表达更多(更容易出错).
像Scala或F#这样的非纯函数式语言(标准函数式语言)可以轻松集成到现有的Java或.NET项目中,因此您可以将这两种范例的优势结合起来.有关函数式语言的典型优点,请参阅此主题.想想非常强大的解析(Monadic解析器组合器/ Parsec)或函数式语言可能的并发编程,你会发现它们是多么有用.