Haskell是否适合作为第一语言?

Ale*_*lex 45 haskell programming-languages

我之前接触过命令式语言(C,一些Java),但我会说我没有编程经验.因此:将我视为非程序员,Haskell是否适合作为第一语言?

我对纯数学和CS的兴趣似乎与大多数Haskell教程的意图一致,尽管我可以从根本上认识到命令式编程的当前和未来行业价值,但我发现了函数式编程的潜力(尽管看起来像这样一个范式转变)令人着迷.

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

一些参考:

C. *_*ann 32

嗯,SICP的存在表明功能语言可以用作介绍材料.然而,Scheme可能比Haskell更平易近人.

Haskell似乎有"难以"学习的声誉,但人们往往会忘记经典命令式编程也很难学习.许多人一开始就挣扎着为变量赋值的概念,而且令人惊讶的程序员实际上从未对指针和间接引用感到满意.

Haskell和抽象数学之间的联系并不像人们有时认为的那么重要,但对于那些对数学感兴趣的人来说,看看类比可能会提供一个有趣的奖励.

  • 我认为SICP非常出色,不是因为它使用了一种功能语言,而是因为它设法使用相同的非常简单的语言来涵盖_multiple_范例. (2认同)
  • @Tikhon Jelvis:我同意.但在某种程度上,更多关于Scheme的内容比关于SICP更多.更不用说Scheme几乎不是关于无类型lambda演算的一些语法.有人甚至可以声称[lambda是最终的多范式](http://library.readscheme.org/page1.html). (2认同)

Don*_*art 29

至少有一项关于将Haskell教授给初学者程序员的影响的研究:

通过以下摘要:

我们认为,在新生课程中教授纯粹的功能性编程对于课程和推广范式都是有害的.相反,我们需要关注更普遍的目标,即教授编程的基本技术和计算的基本概念.我们支持这一观点,并在Haskell教授大型一年级课程(最多600名学生)的几个学期中获得了经验.这些课程由计算机科学专业的学生和其他学科的学生组成.我们通过每学期后的调​​查系统地收集学生反馈.本文提供了在第一年课程中使用现代函数式语言的方法,并在此基础上提倡在此环境中使用函数式语言.

所以,是的,您可以使用Haskell,但您应该专注于基本的,通用的技术和基本概念,而不是功能性编程本身.

还有一些畅销书的初级程序员也使它成为一个有吸引力的目标为教授这些基本概念,其中包括:

  • "在Haskell编程"
  • "功能编程工艺"

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


dby*_*rne 20

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

其原因在于,人们不会以功能的方式思考世界.当他们看到一辆汽车在街上行驶时,他们会看到同一辆汽车,其状态不断变化.他们没有看到一系列略有不同的不可变车.

如果您查看其他SO问题,您会发现Haskell几乎从未被提及为初学者的好选择.

但是,如果你是一名数学家,或者已经足够了解编程以理解函数式编程的价值,我认为Haskell是一个不错的选择.

总而言之,我认为Haskell非常适合你,但不适合典型的初学者.

编辑:感谢您的深刻见解.欧文认为,人们以多范式的方式思考是非常正确的.这加强了我的信念,即像Ruby这样的多范式语言更容易被接受,并且具有使学生暴露于命令式和功能性思维的额外好处.Haskell绝对不是多范式的.

Chuck提到了Haskell的复杂类型系统,这是另一个重点.虽然我个人更喜欢静态类型语言,但使用动态语言可以让初学者忽略这一部分,直到他们好奇地发现幕后发生的事情为止.Haskell的类型系统虽然优雅,但从第1天开始就在你面前.

  • 我同意你的结论,但不同意你的理由.人们根本不会以适合计算机指令的方式思考世界.因为大多数人首先学习命令式编程,所以他们开发了它与他们的世界模型之间的映射.这与希腊人认为希腊语单词是"真正的"名称而其他语言不那么直观的方式没什么不同.Haskell作为第一语言是有问题的,只是因为它太大了以至于需要*年*才真正得到它并且它在类型理论中如此重要. (21认同)
  • 人们走在迈阿密的街上,看到一辆车并不指望犹他州的某个人可以挥动魔杖和噗!这辆车现在是一架飞机.这就是你得到的无限制突变.函数式编程不是在有意义时放弃突变,而是*关于局部推理.具有高中代数的人也看不到一系列方程"x = 1","x = 2"是有意义的,并且他们肯定不会将等式"x = x + 1"视为非常有意义.所以我认为人们确实在思考. (12认同)
  • 希腊人还认为,大脑是阻止脊髓坠落的结,他们的眼睛射出了弗雷金激光束,前四个数字是神圣的真理 - 只是因为希腊人对于一个非常不相关的点是错误的并不意味着所有范式都以同样的轻松程度映射到人类思维模式,或者他的关于汽车和可变状态的观点应该被丢弃. (6认同)
  • 如果我在谈论现实世界中的名词,我将谈论对象,状态,可变属性和不变量.如果我在谈论动词,特别是我需要链接到一起来实现某些动作的动作序列,我将以一种相当实用的方式表达它,因为将其分解为循环和迭代器将是一种痛苦.当我写下食谱时,它将处于命令式模式.陪审团的女士们,先生们,我认为人们认为 - 谁知道? - 以多范式的方式.话虽如此,将这些模式转换为程序仍然几乎总是一个挑战. (6认同)
  • 人们自然地思考世界的方式很难映射到结构化命令式编程.它甚至可以将*更多*映射到纯函数式编程上.以有利于编程的方式进行思考总是将是一种非常不自然的*活动. (3认同)
  • 好吧,我们几年来一直在Haskell中教授函数式编程作为计算机科学专业的第一门编程语言.我们认为这是一个巨大的好处,因为它可以专注于编程的重点.曾经尝试向非程序员解释为什么Java Hello-World程序必须如此? (2认同)

Dan*_*kov 13

Eleven reasons to use Haskell as a mathematician
I cannot write it better than that. But to summarize:

  • Haskell is declarative and mathematics is the ultimate declarative language, which means that code written in Haskell is remarkably similar to what you would write as a mathematical statement.
  • Haskell is high-level, no need to know details about caches, memory management and all the other hardware stuff. Also that means short programs which is always good.
  • Haskell is great for symbolic computation, algebra, logic ...
  • Haskell is pretty :)

To answer your question: you'll have no problem to start with a functional language as a mathematician with no programming experience. Actually it's the better choice, you won't have to repair the brain damage you would get from C/Java/whatever.
You should also check Mathematica. Some people tend to dislike it since it is a commercial closed-source product, but I think it's a pretty good environment for doing mathematics.


Luk*_*keN 12

如果您根本没有任何经验,那么实际上您将更容易在函数式编程中高效工作,尤其是PURE函数式编程.我是一个从命令到功能的移民,我不得不忘记在Haskell中忘记了80%的学习成果.

相比之下,以后更容易从功能切换到命令.

  • 我会说学习如何以不同的方式解决问题是困难的.从野外代码到程序代码的跳跃花费了数十年.从程序到OOP的跳跃尚未完全完成.功能编程是解决需要不同思维方式的问题的另一种方式.这是困难的部分,也是你必须忘记你所知道的80%的部分. (3认同)