可能重复:
Haskell与现实世界中的程序编程
很少有人听到人们说"每个程序员都应该知道Haskell","如果你不了解haskell就不是程序员"等等.但是,我不确定我是否应该费心去尝试简短地理解这种语言.使用口译员(直观地了解基础知识)至少需要几天(如果不是几周),而且我不确定结果是否值得.
一点背景(了解我的知识)
我从小就开始编程(大概在10年或13年前),可编程计算器,移动到基本,然后到非x86汇编(重新复用乘法和除法,编写自修改鼠标驱动程序很有趣),pascal, delphi,现在我几乎完全使用C++.了解unix shell的方法,可以在python中编写软件,也可以在任何东西(如果我附近有参考书)中编写远程类似于C++或Pascal的软件(即块,类似的流控制等).专业化是3D编程和着色器."在水中钓鱼"具有低级操作(C风格的内存分配,指针),对于极度OOP方法不太熟悉(即,为了创建类而创建类).几乎完全是自学成才.我绝对不是新手,但有些地方我可以改进.
那么......在这一点上我可以从学习Haskell获得什么呢?据我所知,这种语言并没有被广泛使用,因此它可以与更少的库接口(就像Delphi编程一样 - 你可以在delphi中进行DirectX编程,如果你真的想要,但你可以用它来写3dsmax/maya插件(好吧,理论上可能是这样,但它肯定不容易)).我也不认为我能够轻松地将一段Haskell代码插入到游戏引擎中.
那么,我可以从中获得什么样的有用知识呢?
PS我不会买"如果你学习另一种语言,你可能会学到一些可能有用的东西"的论点.
Bri*_*ian 82
(当然这是一个重复的问题,但我现在找不到一个.)
你学习它是为了学习纯函数式编程,它迫使你以完全不同的方式做很多事情.你有了一种新的思维方式.无状态编程?编程没有效果?一切都很懒惰?具有类型推断的疯狂类型系统?什么是monad?你的思想会被反复吹嘘,但最终你会从功能性编程中找到新的观点/技术,如果不进行全面的Haskell,那么很难获得.
尝试具体的问题是,试图告诉非Haskeller他们将从Haskell学到什么就像试图向盲人解释颜色"绿色".
Car*_*icz 41
几年前,我们部门的一位漂亮女孩决定兼职学习计算机科学.很多人都惊讶地发现其中一门入门课程是用Haskell作为编程语言教授的!虽然我没有Haskell的经验,但我有一些Lisp和其他函数式编程语言的背景,能够帮助她练习.
不,这个故事没有幸福的结局:她辍学,与其他人结婚,我很久没见到她了.但我认为这个轶事显示了当你最不期望它时,知识是如何有用的.
更实际的说法:你可能已经注意到几年前CPU的速度已经达到了顶峰,现在从计算机中获取更多性能的最实用的方法是安装多个CPU.现在碰巧的是,大多数(如果不是全部)您知道的编程语言基本上都是单一任务,并且受到Von Neumann瓶颈的影响.一个显而易见的解决方案是并行编程,但如果程序的并行部分最终共享状态(即内存),这可能会非常痛苦 - 而这种情况通常就是这种情况.
事实证明,函数式编程是一种风格,它允许您主要避免使用共享状态进行并行编程的问题.换句话说,以FP风格编写程序相当容易,这些程序是"自然"线程安全的并且适合于并行处理.根据语言,编译器和硬件的不同,您甚至可以找到(正如我最近所做的)程序中并行运行的部分程序,而不需要对并行性进行任何显式编码.
我经常出错,但我的猜测是,随着并行编程变得更加重要和困难,函数式编程将成为未来的热门编程范例之一.Haskell可能不会成为首选语言 - 我个人最喜欢的语言是Clojure - 但是看看一种或多种FP语言可能是值得的.
Mar*_*ers 15
我也不认为我能够轻松地将一段Haskell代码插入到游戏引擎中.
如果您只想编写3D游戏引擎,那么学习Haskell可能没什么意义.
如果你想成为一个能够在多种范式中编程的全面的程序员,而你目前只知道类C语言,那么值得一看.
每当你学习一种新的非常不同的语言时,它就会使学习下一种语言变得更容易,因为你不只是记住新的语法,你也在学习不同的编程思维方式.如果您尝试使用新语言并且看到一些新功能,则可以更快地理解它,如果您可以将其与您已知语言的其他功能相关联.你知道的语言越多,这个新功能就越有可能与你之前见过的东西相似.
在工具箱中提供许多工具也很方便.一种语言比一种语言更好地解决了一些问题.如果您有5种不同类型的语言,那么您可以为每个问题选择最佳语言.如果您只知道2或3个非常相似的语言,那么一些问题将很容易解决,但是其他问题可能比使用在特定任务中更好的语言更困难.
如果你喜欢3D编程,你可能会对一些名为The Next Mainstream Programming Languages:游戏开发者的观点的一些幻灯片感兴趣,Tim Sweeney是Epic的创始人和虚幻引擎的技术总监.他多次谈到这个问题,他显然非常重视Haskell.
你可以得到几件事,主要是你对事物的思考方式.例如,注意到最小语言是什么很有趣.如果你通过SICP(并且相同的概念也适用于Haskell),你会注意到你根本不需要循环语法.您不需要任何适用于较大结构的预定义函数.如果给出一个cons构造函数/解构函数,或者一种定义函数的方法,以及递归函数的能力,你几乎可以定义所需的一切.您可以自己定义其他所有内容 - 这是一项有趣的练习.这只是冰山一角.
例如,在一个更实际的层面上,几周前我正在做OCaml的家庭作业并呻吟"为什么这个$%$%#语言没有call/cc!?!" 当我注意到我的想法时,我的思绪被吹了 - 如果我不知道它是什么,我永远不会错过它,如果我不看看Scheme,Haskell,我也不会知道它是什么.红宝石.
您可以在ICFP比赛中找到许多不错的例子; 真的惊叹我的人是该条目在本次大赛.他们在Haskell中创建了一种新语言来解决他们的问题.