【问题标题】:Learning Haskell with a view to learning Scala学习 Haskell 以学习 Scala
【发布时间】:2011-09-29 08:16:07
【问题描述】:

我已经阅读了一些问题,例如 Scala vs Haskell,讨论了两种语言的优点或学习哪种语言,但我已经知道我想学习 Scala。我是 uni 的 Java 程序员,现在主要使用 PHP。

我想学习 Scala,因为它看起来像是对个人项目的 Java 的改进,我还想学习一门函数式语言来提高我作为程序员的知识。

我想知道学习 Haskell 作为函数式编程的介绍是否是一个好主意,因为它纯粹是函数式的,所以我会正确地学习它,而不是在不知道为什么的情况下在 Scala 中随意使用一些函数式编程?

我也想将 Haskell 用于个人项目等,因为它看起来很棒,但我并没有真正看到它在现实世界中的很多应用,似乎更多地用于学术内容,因此想学习它以获得功能理解然后转到 Scala。

【问题讨论】:

    标签: scala haskell functional-programming purely-functional


    【解决方案1】:

    作为一个来自 Java 的人,对于他来说 Scala 是 Haskell 的入门药物,我碰巧认为这是一个好主意(首先学习 Haskell)!

    从概念上讲,Haskell 是一种比 Scala 简单得多的语言,如果您的目标是学习如何进行函数式编程,那么如果您从 Haskell 开始,那么您一定会这样做。按照设计,Scala 支持一种“传统模式”的编码,如果您不想这样做,您实际上不必过多地改变您的 Java(或 PHP)习惯。我认为这是一个战略决策——而且是一个很好的决策!——旨在提高顽固的 Java 拥护者的采用率。

    但那不是你!你实际上有兴趣学习新的东西......那么为什么不全力以赴呢?在纯粹的环境中学习函数式编程,没有混乱和回归旧习惯的诱惑,将在你的大脑中具体化概念。

    然后一定要回到 Scala 并了解它与 Haskell 的不同之处;它在某些方面更弱,在其他方面更强大,但是您将在更好的基础上欣赏这些差异。

    【讨论】:

    • +1 写得非常好。 'Scala 是通往 Haskell 的门户药物'。确实,您可以从 Agda 或 coq 转到 haskell。从 haskell 到 Scala。但通常您真的不想这样做,因为您缺少这些功能。也许看看“在haskell 上创业”的演讲,见:bos.github.com/strange-loop-2011/talk/talk.html#(1) 幽默地说:也许(也许!)当你完美地掌握haskell 时,商业项目将需要haskell 开发人员。也许到那时这里的每个人都会写学习 coq! (或 agda!...或下一件大事)
    • 我同意。学习 Haskell 将以 Scala 无法做到的方式让你摆脱正常习惯。它还将使您远离传统的面向对象,并学习另一种思考类(类型类)的方式。我可以推荐这本书amazon.com/Programming-Haskell-Graham-Hutton/dp/0521692695
    • @mrsteve:公平地说,Scala 确实提供了一些 Haskell 所缺乏的东西。例如子类型+有界量化。当然,这种额外的能力是以可判定类型推断为代价的,许多人认为不值得放弃。
    • Haskell 是通向 Coq 和范畴论等各种硬药的入门药 :)
    • 我想知道他是否会在被 Haskell 的美貌所吸引后“重返 Scala”... :-)
    【解决方案2】:

    我是从 Java 背景来到 Scala 的。最初,我只是将 Scala 视为更好的 Java。随着时间的推移,我开始在 Scala 中使用越来越多的函数式概念。最终,我觉得我需要对函数式编程有更纯粹的理解。正是在这一点上,我离开并学习了 Haskell。

    当我回到 Scala 后,我发现使用函数式风格要容易得多,而且我之前纠结的一些概念也变得更有意义了。

    您不必学习 Haskell 即可成为一名优秀的 Scala 开发人员,但我认为,一旦您在 Scala 中达到一定水平,对函数式编程概念有更深入的理解确实会有所帮助。

    【讨论】:

      【解决方案3】:

      我不会那样做。如果您直接使用 Scala(您的最终目标),您可以节省时间。无论如何,您都会学习函数式编程,但由于 Scala“不那么纯粹”,您将能够使用一些类似 Java 的结构开始在 Scala 中编写程序,这将使转换变得更简单。

      即使您使用 Haskell,您的第一个程序的“功能质量”也将低于后来的程序,因为只有实践才能改善这一点。启动 Scala,您的第一个程序将像您的第一个 Java 或 PHP 程序一样“质量较差”,但通过练习,您会有所改进。把时间花在不相关的任务上,希望他们能有所帮助,这可能会导致你浪费时间。

      专注于你的目标。如果那是 Scala,那就去吧。

      更新:我相信this 可能与该问题有关。它提出了一个关于生产力(交付软件)与寻求“纯知识”的观点。

      【讨论】:

      • 我同意。此外,如果您在 Scala 中,对某些事物使用命令式风格而对另一种事物使用函数式风格并没有错。学习 Haskell 不会帮助您决定哪种工具最适合这项工作。它将教你如何完全消除命令性,这是一种不同的范式。
      • +1 如果您的目标是学习 Scala,那么就学习 Scala:大多数教材都假定具有 Java 背景,因此会明确地帮助过渡,尤其是不要开始教你 Haskell!
      • Re:第一个程序“功能质量较差”,我假设您的意思是“做现实世界的事情”:OP 将立即开始接受新概念。他们的主要目标似乎是巩固 FP 的概念。 “现实世界”应用程序在很多方面与纯 FP 概念的相关性不如您在 GHCi 中输入所获得的学习。
      • @amindfv 我的意思是,由于 Scala 允许混合使用,起初使用 Scala 创建的程序将比函数式程序更具命令性。我个人认为这还不错,因为它允许您通过在迭代中改进代码来通过实践学习,其中每次重构都更加“功能化”。它适合我学习。从对答案的投票来看,人们更喜欢一种不同的学习方法,绕道选择理论,然后回到最初的目标,在这种情况下,Scala 提供的混合变得无关紧要:)
      【解决方案4】:

      直接从 Scala 开始,而不首先使用任何纯函数式编程语言的风险在于,您可能会过于频繁地被过程解决方案所吸引。

      不过,我不会尝试将 Haskell 作为函数式编程的介绍:并不是说它特别难——它的语法非常简洁——但它绝对是非常奇特的(即使在函数式编程的奇特世界中),我认为你应该尝试使用更容易移植到 Scala 的语言,例如 Racket 或普通 Scheme。

      为了更好地理解我的意思,请查看 Haskell、Scala 和 Scheme 中的列表推导。

      【讨论】:

        【解决方案5】:

        我先学了 Haskell,然后学了 Scala,从不后悔。如果您先学习 Haskell,您将对 FP 有更深入的了解。您对 FP 背后的概念及其重要性的理解将深入人心。Scala 的大部分内容来自 Haskell(恕我直言)。当你有 Haskell 背景时,它会更有意义。不要回避!你的努力会得到回报。

        【讨论】:

          【解决方案6】:

          对我来说,我想学习 Scala 和函数式编程;因此,很简单,我正在学习 Scala。我的学习资料是Programming Scala。在我阅读了关于 syntx 和其他内容的早期章节之后,我跳过了涉及 OO 的章节并跳到了第 8 章,其中涵盖了函数式编程的内容。在那里,我让自己与 FP 作斗争。

          我阅读了this scala 代码,它是用FP 方式编写的,并分析了it。您想学习 Scala 是为了“……为个人项目改进 Java”。和 Haskell 用于 FP 介绍。因此,似乎首先,您希望在您的 java 项目中高效,然后将 FP 视为副作用。为了提高效率,你必须掌握语言。有很多东西要学习和掌握语言,掌握语言的唯一方法是你必须用那种语言编写代码。当您学习/使用 Scala 时,即使您愿意,也无法避免 FP。我一直在阅读 Scala 博客(也是这本书),作者总是在谈到 FP 概念时不遗余力地进行解释。您不必担心走 Scala 路线没有掌握 FP。是的,当你学习 Scala 时,你可以像 this 这样从 Haskell 中汲取灵感。或者正如上面的Chris Turner 所指出的,当您已经使用 Scala 高效时,您可以深入研究更多的 FP。

          你想去A点,为什么不直接去A点呢?如果你走B点(Haskell)的路线,你将不得不推迟你的生产力,就像Pere Villega提到的那样。

          【讨论】: