Haskell与现实世界中的程序编程

时间:2009-06-21 19:24:38

标签: haskell functional-programming imperative-programming

这些天我正在认真学习函数式编程。

虽然我对Haskell以及它似乎提供的可能性感到非常兴奋,但我现在也可以看到它需要一段时间来学习。在关于How to learn Haskell的SO问题中,答案指出实际“掌握”它需要数月甚至数年。

现在,我知道C,PHP,一些面向对象的东西等等。并且被告知Haskell在“真实世界”中没有被广泛使用,我是否会更好地提高我的常规语言技能我知道?哈斯克尔值得挣扎吗?

在关于Why people think functional programming will catch on的这个问题中,结论似乎是函数式编程将“流行”。但是程序编程肯定会保持领先,对吗?

编辑:keparo很好地澄清了我的问题:与过程语言相反,研究Haskell和函数式编程范例对我来说是否有价值?

13 个答案:

答案 0 :(得分:51)

Haskell并不像人们想要学习那么难。 Haskell打开了一个你从未知道的新世界。学习它和任何其他语言一样有价值。您可能找不到要求您进行Haskell编程的工作,但这是否真的意味着语言没有价值?

Haskell会教你很多新东西,它会告诉你如何用你/做/用的语言更好地编程。你可以利用它在业余时间做自己的个人项目。

如果你将“现实世界”定义为“现金生成器”,那么Haskell在“真实世界”中的用处并不多。因此,如果这是您的目标,那么您可能需要重新考虑目标:p

另外,我真的不喜欢那部分选择“如何学习haskell”的答案。掌握任何语言需要几个月到几年,而不仅仅是Haskell。取决于您如何定义“主”。我可以使用Haskell达到相当高的效率,而且我只学习了一个月,而且我一直都很慢。

答案 1 :(得分:19)

如果不出意外,学习Haskell提供的思维方式的改变将在您必须回到使用仍在工作场所中使用的那些程序语言时帮助您。

功能范例开始进入各种主流应用程序和语言 - 甚至C ++也将在C ++ 0x中添加一个(残缺的)lambda。

您可能还想查看一些混合语言,如Scala或OCaml。 Scala正在Twitter上使用,OCaml正在Jane's Street的金融交易平台中使用。

答案 2 :(得分:10)

在专业设置中,你可能不应该期望在任何地方使用Haskell几乎与C系列语言一样。如果问题是对你研究Haskell和函数式编程范例是否有价值,答案是肯定的。您可以将对编程的丰富理解应用到您的所有工作中。

答案 3 :(得分:8)

我学习了Haskell,因为它是迄今为止我用Scala,Clojure,OCaml和Scheme尝试过的最好的函数式语言,但我并没有真正期望将它用于工作。

事实证明,它对于那些对团队来说太小而且在Java中过于耗时的奇怪工作来说是完美的。到目前为止,我已经将它用于ad-hoc数据迁移,即将CSV导出转换为另一种格式,XML的批量转换(HXT比XSLT更简洁,更强大),屏幕抓取互联网和软件项目估算,包括建模风险使用概率monad并使用回溯产生最佳甘特图。这都是需要做的真正的工作,我甚至不愿意尝试用Java来做,因为这将是一项为期数日的工作。

我现在使用它而不是Excel来进行任何模糊的数学运算,因为在文本编辑器中创建haskell源中的值列表要比在Excel中键入它们要多得多。一旦进入haskell,我就可以做各种各样的魔法,比如Excel不能做的回溯,概率分布等。如果我需要图表,那么我将值吐出为CSV(2行代码)并将它们加载到Excel中。

唯一的缺点是需要几个月才能熟练,但值得恕我直言。

答案 4 :(得分:7)

  

与过程语言相反,研究Haskell和函数式编程范例对我来说是否有价值?

如果拥有扩展的技能组合是有价值的,那么:是的。

您可能会选择一个优势:并行和并发编程。过去的程序语言往往没有明确的副作用概念,因此在其中编写并行程序很难正确执行。功能语言(特别是那些限制像Haskell这样的副作用的语言)对于高效的并行编程有更多的说法。

拥有这种技能不会伤害你。

答案 5 :(得分:5)

我可以看到,如果非功能代码非常容易使用,那么函数式编程在生产环境中可能是一个优势。当我们想出F#时,MS也可以看到它。

由于它们都编译为IL,因此您可以处理要求功能方法功能的问题,并在程序代码中非常轻松地使用这些解决方案。

通过这种方式,功能代码可以轻松地在生产环境中找到它的方式

因此,既然MS的用户群很大,我的猜测是如果F#在不久的将来不会流行,那么Haskell也不会。

答案 6 :(得分:5)

我认为这是值得的。 它将帮助您了解问题是如何解决的,而不仅仅是计算机的工作原理。

也许一个特殊的问题是Haskell本身 - 作为一种纯粹的功能性语言,它有点“硬核”,另一方面可能使事情变得复杂。

相反,函数式编程可能非常实用 - 许多OO /命令式语言现在已经包含了功能元素(Linq,匿名函数,只读值,函数指针/委托,类型推理):你可以专注于应该做的事情,它允许你用更少的代码表达更多(更容易出错)。

Scala或F#等非纯函数式语言(标准函数式语言)可以轻松集成到现有的Java或.NET项目中,因此您可以将这两种范例的优势结合起来。有关函数式语言的典型优势,请参阅this thread。想想非常强大的解析(Monadic解析器组合器/ Parsec)或函数式语言可能的并发编程,你会发现它们是多么有用。

答案 7 :(得分:4)

  

与过程语言相反,研究Haskell和函数式编程范例对我来说是否有价值?

除非你想变得悲惨。卢克工厂在Why learning Haskell/Python makes you a worse programmer中说:

  

所以,学习Python和Haskell让我士气低落并鼓励他们   我编写奇怪且难以理解的代码......

(这不完全是个玩笑。)

答案 8 :(得分:2)

无论您目前使用何种语言,扩大视野都可以帮助您成为更好的程序员。例如,在编写Lisp宏之后,你永远不会以相同的方式看编程。在你开始用Haskell术语思考之后,你会发现自己在编写函数并希望用不太高级的语言进行闭包。

从C#中的好东西来看,比如lambdas,类型推理,闭包,and so on,学习Haskell会让你在明天的主流语言中占据一席之地。

答案 9 :(得分:1)

有些人喜欢在Haskell中编程。如果你可以选择你的环境,并考虑享受,那么也许你应该跳进来。

许多程序员无法选择他们的工具,享受不是他们选择的因素。他们中的许多人在他们的工作场所使用C / Java /等作为“核心项目源”,但随后也选择或需要使用Python作为“脚本”,例如使用SCons构建脚本,其他生成Java /等的脚本代码,测试系统,概念证明等。而在其他地方,Python也用于“核心项目”。

8年后,它将是Haskell,而不是Python,它将“来找你”。但你可以早点来。

答案 10 :(得分:1)

您可以结合使用函数式编程对语言务实。

所有现代脚本语言s.a. JavaScript或Lua允许使用功能范例。

答案 11 :(得分:1)

功能概念日益强大。请注意Ruby周围的一系列活动和兴趣。我最近也注意到除了浏览器脚本语言之外,对JavaScript的兴趣也有所增加。你现在可以潜入游戏,尽管投入的时间可能无法在今年或明年获得回报。

这取决于您的一般游戏计划。您是将编程本身作为目的还是作为达到目的的手段?如果它是前者,请坚持使用Haskell。如果是后者,坚持主流,“就业”语言。等待Haskell起飞然后突袭。

答案 12 :(得分:0)

为什么是程序性的而不是面向对象的,除了C之外很多年都没有使用过程。

商业上说。我会选择Java或C#。他们都付出的代价并不重要,而且这些技能可以与其他类似的思想语言如python,Ruby和JavaScript互换。

Haskell值得花时间和精力,虽然它是非常学术性的,但有些银行会使用它,尽管欧洲和英国的许多人正在将代码库转移到F#。

我认为FOP不会在商业上以极快的速度发展。但这些技术肯定会在主要的语言中出现。特别是使用多核芯片设计并使代码并行运行。