我的编程经验主要是命令式语言(C,一些Java),但我会说我没有编程经验。因此:把我当作一个非程序员,Haskell是否适合作为第一门语言?
我的纯数学和计算机科学兴趣似乎与大多数Haskell教程的意图相吻合,尽管我本能地认识到命令式编程的当前和未来行业价值,但我发现函数式编程(在其作为范例的巨大转变)的潜力很迷人。
我想我的问题可以简化如下 - 非程序员必须了解命令式编程才能欣赏和充分利用函数式编程吗?
一些参考资料:
我的编程经验主要是命令式语言(C,一些Java),但我会说我没有编程经验。因此:把我当作一个非程序员,Haskell是否适合作为第一门语言?
我的纯数学和计算机科学兴趣似乎与大多数Haskell教程的意图相吻合,尽管我本能地认识到命令式编程的当前和未来行业价值,但我发现函数式编程(在其作为范例的巨大转变)的潜力很迷人。
我想我的问题可以简化如下 - 非程序员必须了解命令式编程才能欣赏和充分利用函数式编程吗?
一些参考资料:
嗯,SICP 的存在表明函数式语言可以用作入门材料。Scheme 可能比 Haskell 更易于接近。
Haskell 似乎有一个学习难度很高的声誉,但人们往往忘记了经典的命令式编程也很难学。许多人一开始就对“将值分配给变量”的概念感到困惑,而且令人惊讶的是,很多程序员实际上从未真正熟悉指针和间接引用。
Haskell 和抽象数学之间的联系并不像人们有时所认为的那样重要,但对于对数学感兴趣的人来说,查看类比可能提供一个有趣的奖励。
至少有一项关于教授Haskell给初学者的影响的研究:
以下是摘要:
我们认为,在大一课程中教授纯函数式编程对课程以及促进这种范式都是有害的。相反,我们需要专注于教授编程的基本技术和计算机的基本概念。通过几个学期(多达600名学生)教授Haskell的经验支持了这种观点。这些班级由计算机科学专业的学生和其他学科的学生组成。我们通过在每个学期后进行调查来系统地收集学生反馈。本文提出了在大一课程中使用现代函数式语言的方法,并基于此,主张在这种环境中使用函数式语言。
因此,您可以使用Haskell,但应专注于基本、通用的技术和基本概念,而不是纯函数式编程。
对于初学者程序员,有许多受欢迎的书籍,也使它成为教授这些基本概念的有吸引力的目标,包括:
此外,Haskell已经被广泛地作为第一门语言教授-- 但请记住,重点是专注于在Haskell中说明的核心概念,而不是教授Haskell这个庞大且丰富的语言本身。
我会反对普遍的观点,认为Haskell并不是适合典型的初学者作为第一门编程语言的好选择。我认为对于一个刚开始的新手来说,它并不像Ruby这样的命令式语言那样容易理解。
原因是大多数人没有用函数式的方式思考世界。当他们看到一辆汽车在路上行驶时,他们看到的是同一辆汽车,具有不断变化的可变状态。他们没有看到一系列略微不同的不可变汽车。
如果你查看其他SO问题,你会发现Haskell几乎从来没有被提及为初学者的好选择。
然而,如果你是数学家,或者已经知道足够的编程知识,能够理解函数式编程的价值,我认为Haskell是一个很好的选择。
所以总结一下,我认为Haskell非常适合你,但对于典型的初学者来说并不适合。
编辑:感谢有见地的评论。Owen指出人们以多范式的方式思考是非常真实的。这加强了我认为像Ruby这样的多范式语言会更容易掌握的信念,并且有额外的好处,能够让学生接触命令式和函数式思维。Haskell显然不是多范式的。
Chuck提到了Haskell先进的类型系统,这也是一个很好的观点。虽然我个人更喜欢静态类型的语言,但使用动态语言可以让初学者在好奇心驱使下忽略掉那一部分知识直到他们想要了解背后正在发生什么。Haskell的类型系统,虽然优雅,但从第一天开始就非常显眼。
11个数学家使用Haskell的理由
总结如下:
回答您的问题:作为一名没有编程经验的数学家,使用函数式语言开始并不会有问题。实际上,它是更好的选择,因为您不必纠正从C/Java/任何其他语言中获得的大脑损伤。
您还应该检查Mathematica。由于它是商业闭源产品,有些人倾向于不喜欢它,但我认为它是进行数学计算的非常好的环境。
如果你完全没有任何经验的话,实际上在函数式编程中,特别是纯函数式编程中,你会更容易提高生产力。我曾从命令式编程转向函数式编程,发现自己必须忘掉我所学的80%才能在Haskell中提高生产力。
相比之下,后来从函数式编程转向命令式编程则更容易一些。
return
与C中的return
或者变量赋值(因为Haskell中没有变量)。如果我真的把这些都忘了,那我当然会做错 :) - LukeN我认为它适合作为第一门语言,而且学习其他命令式语言可能会干扰学习过程(因为需要先进行大量的反学习)。
但需要注意的是,对于数学背景的人来说,理解函数式编程原则可能更容易,因为这些概念是抽象的数学概念。
我知道许多学校将其作为第一门函数式语言教授,但不是作为第一门语言。
不。
一个Haskell98程序非常容易被理解。LYAH是一个很好的教程,适合没有经验但想要避免学习扩展x、y、z的初学者。但是防止学习者在扩展x、y、z上绊倒是很棘手的。很快他们开始探索,并且被高级编程/数学概念所淹没,这些概念更难理解,但需要理解才能阅读别人的代码。
如果每个Haskell代码都只用Haskell'98/'10编写,我可能会说是的。