Is Haskell suitable as a first language?
我以前曾接触过命令语言(C,一些Java),但是我会说我没有编程经验。因此:把我当作一个非程序员,Haskell是否适合作为第一语言?
我对纯数学和CS的兴趣似乎与大多数Haskell教程的意图一致,虽然我从本质上认识到了命令式编程的当前和未来的行业价值,但我发现函数式编程的潜力(尽管它似乎是这样一种范式转换)令人着迷。
我想我的问题可以提炼如下-非程序员是否需要理解命令式编程才能欣赏和充分利用函数式编程?
一些参考文献:
是否有关于函数式/声明式或命令式编程作为第一语言更容易学习的研究?
哪些编程语言帮助您更好地理解编程?
好吧,sicp的存在表明函数语言可以作为入门材料。然而,这个计划可能比哈斯克尔更容易接近。
Haskell似乎以"难学"著称,但人们往往忘记经典的命令式编程也很难学。许多人一开始都在为变量赋值这一概念上苦苦挣扎,令人惊讶的是,许多程序员从未真正习惯于使用指针和间接引用。
哈斯凯尔和抽象数学之间的联系并不像人们想象的那么重要,但是对于对数学感兴趣的人来说,看看这些类比可能会带来有趣的收获。
至少有一项关于向初学者教授haskell的效果的研究:
- 在第一年教授纯函数式编程的风险和好处。Manuel M.T.Chakravarty和Gabriele Keller。《功能编程杂志》14(1),第113-123页,2004年。
摘要如下:
We argue that teaching purely
functional programming as such in
freshman courses is detrimental to
both the curriculum as well as to
promoting the paradigm. Instead, we
need to focus on the more general aims
of teaching elementary techniques of
programming and essential concepts of
computing. We support this viewpoint
with experience gained during several
semesters of teaching large first-year
classes (up to 600 students) in
Haskell. These classes consisted of
computer science students as well as
students from other disciplines. We
have systematically gathered student
feedback by conducting surveys after
each semester. This article
contributes an approach to the use of
modern functional languages in first
year courses and, based on this,
advocates the use of functional
languages in this setting.
所以,是的,您可以使用haskell,但是您应该关注基本的、一般的技术和基本的概念,而不是函数编程本身。
对于初学者程序员来说,有许多流行的书籍也使其成为教授这些基本概念的吸引人的目标,包括:
- "在Haskell编程"
- "函数式编程的技巧"
此外,haskell已经作为第一语言被广泛教授。--但请记住,关键是要关注haskell中所描述的核心概念,而不是教授haskell本身的大型、丰富的语言。
我将反对流行的观点,并说haskell对于典型的第一次编程人员来说不是一种好的第一次编程语言。我认为对于初学者来说,它不像Ruby这样的命令式语言那样容易接近。
原因是人们不以功能性的方式思考世界。当他们看到一辆车在街上行驶时,他们看到的是同一辆车,状态不断变化。他们没有看到一系列稍有不同的不变的汽车。
如果你看看其他的问题,你会发现哈斯克尔几乎从来没有提到过作为一个初学者的好选择。
但是,如果你是一个数学家,或者已经对编程有了足够的了解来理解函数式编程的价值,我认为Haskell是一个不错的选择。
总而言之,我认为haskell非常适合你,但不适合典型的初学者。
编辑:感谢您的富有洞察力的评论。欧文认为人们以多范式的方式思考的观点是非常正确的。这强化了我的信念,即像Ruby这样的多范式语言更容易被学习,而且还有一个额外的好处,就是让学生同时接受命令式思维和功能性思维。哈斯克尔显然不是多范式。
查克提到了哈斯克尔复杂的类型系统,这是另一个很好的观点。虽然我个人更喜欢静态类型的语言,但是使用动态语言可以让初学者忽略这一块拼图,直到他们足够好奇地了解幕后发生的事情。哈斯克尔的打字系统,虽然优雅,但从第一天开始就在你的脸上。
使用哈斯克尔作为数学家的十一个原因我写不好。但总的来说:
- haskell是声明性的,数学是最终的声明性语言,这意味着用haskell编写的代码与作为数学声明编写的代码非常相似。
- Haskell是高级的,不需要知道关于缓存、内存管理和所有其他硬件的细节。也就是说,短节目总是好的。
- 哈斯克尔是伟大的符号计算,代数,逻辑…
- 哈斯克尔很漂亮:)
回答你的问题:作为一个没有编程经验的数学家,你可以从函数语言开始。事实上,这是更好的选择,你不必修复你从C/Java/任何东西得到的脑损伤。你还应该检查一下Mathematica。有些人不喜欢它,因为它是一个商业的封闭源代码产品,但我认为它是一个很好的数学环境。
如果您根本没有任何经验,那么在函数式编程中,尤其是纯函数式编程中,工作效率更高。我是一个从当务之急到职能转变的移民,我不得不处理不得不忘记我在哈斯克尔学到的80%的生产力。
相比之下,以后从功能性转换为命令性更容易。
一方面,我认为haskell作为第一语言是很好的,但是我想,对于任何对编程感兴趣的人来说,它应该与C并行学习,或者在C(或汇编)之后学习。C是了解引擎盖下发生了什么,做这件事和那件事的成本是多少的必要条件,并最终了解更高层次的抽象和自动资源管理的有用性。我认为,当接触到C(作为一种低级命令语言)和haskell(作为一种高级功能语言)时,大多数学生会发现haskell既实用又富有表现力。
另一方面,我认为编程是一门手艺。这是一项实践活动,学习创造新的、有用的或有趣的事物的乐趣是很重要的。所以你需要把事情做好。最简单的方法是使用一种语言,它有解决问题的工具,即数据格式的库,解决问题的算法。此时,python(或ruby)可能是一个更好的选择,因为hackage在很多方面仍然落后于pypi(比如,你需要多少天来教一个新手操作一个图像,或者在haskell中绘制图表?).
所以,我的观点是,有必要接触一些低级的命令式编程(可能是OOP)。那么你就可以理解哈斯克尔的价值了。但要完成任务并迅速提高生产率,对于初学者来说,Python是更好的选择。haskell需要几个星期才能成为你的工具。
是的。现实世界的haskell是一个很好的进入它的方式http://book.realworldhaskell.org/
我会说,它适合作为第一语言,而且先学习命令式语言可能只会干扰学习过程(因为它需要大量的先释放)。
作为一个警告,我会补充说,一个函数式的语言原则可能会被数学背景的人最好理解,因为概念是抽象的数学概念。
我知道许多学校确实把它作为第一功能语言来教学,但并不是作为第一语言来教学。
不。
很容易理解Haskell98程序。对于没有经验的人来说,lyah是一个很好的教程,但是要防止学习者在扩展x上绊倒,y z是很棘手的。很快,他们开始探索并被高级编程/数学概念淹没,这些概念很难理解,但需要理解才能阅读他人的代码。
如果哈斯克尔的每一篇文章都是用哈斯克尔98/'10写成的,我可能会说是的。
我会犹豫不决地说"是",除了这样一个事实:在学习中,如果你选择一种更迫切的语言来开始编程,那么找一个人作为导师或导师就不那么令人生畏了。我可以建议用r或python(用numpy和scipy)代替吗?
如果没有必要这样回答这个问题,我会补充说:如果你觉得哈斯克尔的好斗太难,不要泄气。
还有其他的编程语言,甚至是函数语言,它们都是后期绑定的。