Haskell适合作为第一语言吗?

我曾经接触过命令式语言(C,一些Java),但是我会说我没有编程经验 。 因此:把我当作非程序员来对待,Haskell是否适合作为第一语言?

我对纯math和CS的兴趣似乎与大多数Haskell教程的意图是一致的,尽pipe我可以固有地认识到命令式编程的当前和未来的行业价值,但是我发现函数式编程的潜力(尽pipe似乎是这样的范式转变)引人入胜。

我想我的问题可以被提炼如下 – 一个非程序员是否必须理解命令式编程来欣赏和充分利用函数式编程?

一些参考:

  • 有没有关于function性/声明性或命令式编程作为第一语言更容易学习的研究?

  • 哪些编程语言帮助您更好地理解编程?

我会反对stream行的观点,并说Haskell不是一个典型的第一次程序员的第一个编程语言。 我不认为像Ruby这样的命令式语言对于初学者来说是一种平易近人的方式。

其原因是人们不以function的方式来思考世界。 当他们看到一辆在街上行驶的汽车时,他们看到同一辆汽车,变幻莫测的状态不断变化。 他们没有看到一系列稍有不同的不可改变的汽车。

如果你查看其他的SO问题 ,你会发现Haskell几乎从来没有被提及过作为一个初学者的好select。

但是,如果你是一个math家,或者已经对编程有足够的了解,以理解函数式编程的价值,我认为Haskell是一个不错的select。

所以总结一下,我认为Haskell对你来说是一个完美的select,但对于典型的初学者来说却不太合适。

编辑:感谢有见地的评论。 欧文认为人们以多种模式思考是非常正确的。 这增强了我的信念,即像Ruby这样的多范式语言将更容易被接受,并且具有将学生暴露给命令式和function式思考的额外好处。 哈斯克尔决不是多范式的。

查克提到了哈斯克尔的复杂型系统,这是另一个伟大的点。 虽然我个人比较喜欢静态types的语言,但是使用dynamic语言可以使初学者忽略这个难题,直到他们好奇地发现后面发生的事情为止。 Haskell的types系统,虽然优雅,从第一天就在你的脸上。

那么, SICP的存在意味着function语言可以作为介绍材料。 然而,Scheme也许比Haskell更加平易近人。

Haskell似乎有一个“难”的学习声誉,但人们往往忘记,经典的命令式编程也很难学习。 许多人首先想到了赋值给variables的概念,而令人惊讶的一些程序员从来没有真正习惯于使用指针和间接引用。

哈斯克尔和抽象math之间的联系并不像人们有时假设的那么重要,但对于那些对math感兴趣的人来说,看类比可能会提供一个有趣的奖励。

Haskell对初学程序员的影响至less有一项研究:

  • 第一年纯function编程教学的风险与收益 。 Manuel MT Chakravarty和Gabriele Keller。 function编程杂志14(1),pp 113-123,2004。

通过以下摘要:

我们认为,在新生课程中单纯地讲授function性程序devise对课程和推广范式都是不利的。 相反,我们需要把重点放在编程基本技术和计算基本概念的更普遍的目标上。 我们支持这个观点,在Haskell的几个学期中教授大一年级(多达600名学生)的经验。 这些课程由计算机科学学生和其他学科的学生组成。 我们系统地收集学生的反馈信息,每学期进行一次调查。 本文提供了在第一年课程中使用现代function语言的方法,并在此基础上提倡在此设置中使用function语言。

所以,是的,你可以使用Haskell,但你应该关注基本的,一般的技术和基本的概念,而不是函数式编程本身。

对于初学程序员来说, 有很多热门的书籍 ,这些书籍也成为了教授这些基本概念的有吸引力的目标,其中包括:

  • “在Haskell中编程”
  • “函数式编程的工艺”

另外,Haskell已经被广泛教授为第一语言。 但是请记住,关键是要关注Haskell中所阐述的核心概念,而不是传授Haskell本身丰富的大型语言。

作为math家使用Haskell的十一个理由
我不能写得比这更好。 但是总结一下:

  • Haskell是声明性的,math是最终的声明性语言,这意味着使用Haskell编写的代码与你写作math语句非常相似。
  • Haskell是高层次的,不需要知道关于caching,内存pipe理和所有其他硬件的细节。 这也意味着总是很好的短节目。
  • Haskell非常适合符号计算,代数,逻辑…
  • 哈斯克尔是可爱:)

要回答你的问题:作为一个没有编程经验的math家,从function语言开始,你将没有问题。 其实这是更好的select,你将不必修复你将从C / Java /无论如何得到的脑损伤。
你也应该检查Mathematica。 有些人往往不喜欢它,因为它是一个商业封闭的产品,但我认为这是一个相当好的math环境。

如果您还没有任何经验,实际上您将更容易在function编程方面发挥作用,特别是PURE函数式编程。 我是一个迫切需要移民的移民,我不得不处理在Haskell中学到的80%的生产力。

相反,稍后从function切换到命令更容易。

一方面,我认为Haskell作为第一语言是很好的,但是我想,对于任何对编程感兴趣的人来说,应该把它和C语言或者C语言(或者汇编语言) 并行学习。 C有必要了解底层发生了什么事情,这样做的成本是多less,最后才能体会到更高层次的抽象和自动资源pipe理的有用性。 我认为,当暴露于C(作为低级命令式语言)和Haskell(作为高级函数式语言)时,大多math生会发现Haskell既实用又富有performance力。

另一方面,我认为编程是一门技术。 这是一个实际的活动,重要的是要学习创造新的,有用的或有趣的东西的喜悦 。 所以你需要把事情做好。 而最简单的方法是使用一种语言,它有你的问题的工具,即为您的数据格式图书馆 ,你的问题types的algorithm。 在这一点上,Python(或Ruby)可能是一个更好的select,因为Hackage在很多领域仍然落后于PyPI(也就是说,你需要多less天才能教授新手操纵图像,或者在Haskell中绘制图表? )。

所以,我的意见是,一些暴露于低层次的命令式编程是必要的(对于OOP,可能不是)。 那么你可以理解Haskell的价值。 但是为了完成任务并迅速提高效率,Python对于初学者来说是更好的select。 Haskell需要几个星期才能成为您的工具。

我认为它适合作为第一语言,先学习一个命令式语言可能只会干扰学习过程(因为它首先需要大量的学习)。

作为一个告诫,我想补充一下,function性语言原则可能最好由具有math背景的人理解,因为概念是抽象的math原理。

我知道很多学校确实把它作为第一function语言,而不是第一语言。

是的。 真实世界Haskell是一个很好的方法来进入它http://book.realworldhaskell.org/

我会犹豫地说“是”,除了在学习中,如果你select一个更强制性的语言来开始编程,寻找某个人作为导师或导师将是一个不那么艰巨的任务。 我可以build议R还是Python(用NumPy和SciPy)呢?

没有。

清楚地理解haskell98程序是非常容易的。 对于没有经验的人来说, LYAH是一个很好的教程,但是试图防止学习者绊倒扩展x,yz是非常棘手的。 很快,他们开始探索,并被先进的编程/math概念所困惑,这些概念很难理解,但需要被理解为阅读其他代码。

如果每一个哈斯克尔都是用哈斯克尔的'98 / '10写成的,我可能会说是的。

没有必要这样回答这个问题,我想补充一句:如果你发现哈斯克尔的胡言乱语太难了,不要气馁。

还有其他的编程语言,甚至是function性的,都是迟到的。