【问题标题】:Why should I want to learn haskell? [duplicate]我为什么要学习haskell? [复制]
【发布时间】:2010-07-04 18:03:51
【问题描述】:

可能重复:
Haskell vs. procedural programming in the real world

我很少听到有人说“每个程序员都应该知道 Haskell”、“如果你不知道 Haskell,你就不是程序员”等等。 但是,我不确定我是否应该费心尝试简要了解该语言。使用解释器(以直观地理解基础知识)至少需要几天(如果不是几周的话),我不确定结果是否值得。

一些背景知识(了解我的知识)
我小时候(大约在 10 或 13 年前)就开始使用可编程计算器进行编程,转向基本,然后转向非 x86 程序集(重新实现乘法和除法,编写自修改鼠标驱动程序很有趣),帕斯卡, delphi,现在我几乎完全使用 C++。了解我在 unix shell 周围的方式,可以用 python 编写软件,并且可能在任何类似于 C++ 或 Pascal 的东西(如果我附近有参考书)(即块、类似的流控制等)中编写软件。专业是 3D 编程和着色器。具有低级操作(C 风格的内存分配、指针)的“水中的鱼”,对极端 OOP 方法(即为了拥有类而创建类时)不太适应。几乎完全自学。 IE。绝对不是新手,但有些地方我可以改进。

那么...我现在可以从学习 Haskell 中获得什么?据我所知,这种语言并没有真正被广泛使用,因此它可以接口的库可能更少(就像在 Delphi 编程中一样 - 如果你真的想要,你可以在 delphi 中进行 DirectX 编程,但是你可以'不要用它写 3dsmax/maya 插件(好吧,理论上可能是可能的,但肯定不容易)。我也不认为我能轻易地将一段 Haskell 代码插入游戏引擎。

那么,我能从中得到哪些有用的知识呢?

附:我不会赞同“如果你学习另一种语言,你可能会学到一些可能有用的东西”的论点。

【问题讨论】:

  • @Sergio Tapio:我不这么认为。你的问题是“我可以在哪里使用haskell”,我问“我会从中获得什么样的有用知识”。我不在乎语言是否流行,但如果它教授某种概念,我将能够(可能)重新应用另一种语言,这可能值得我花时间。
  • 我不同意它是重复的,但如果模组是这样想的,那么无论如何......
  • “我也不认为我能轻易地将一段 Haskell 代码插入游戏引擎。”你错了:我承认这比混合 C 和 C++ 更难,但比将任何东西绑定到 C# 或 Java 要容易得多。

标签: haskell


【解决方案1】:

(当然这是一个重复的问题,但我现在找不到。)

您学习它是为了学习纯函数式编程,这迫使您以完全不同的方式做很多事情。你会得到一种新的思维方式。无状态编程?没有效果的编程?一切都是懒惰的?带有类型推断的疯狂类型系统? monad 到底是什么鬼?你的思想会反复被震撼,但最终你会从函数式编程中获得新的观点/技术,否则如果不去成熟的 Haskell 就很难掌握这些观点/技术。

试图具体化的问题在于,试图告诉非 Haskell 人他们将从 Haskell 中学到什么就像试图向盲人解释“绿色”颜色。

【讨论】:

  • 顺便说一句,对“疯狂的类型系统”的反应——我发现 Haskell 的类型系统是可以想象的最自然的东西,这让我想知道为什么其他语言没有如此明智的类型系统。 :-)
  • @Shreevatsa,如果您的“好奇”不是修辞,那么:“其他”语言没有这样的类型系统,因为它们面向执行期间进行的操作(甚至是 OO 语言),不是符号之美或构成程序的概念之间的关系。
  • @Carl Smotricz:“这就像 Haskell 的类型系统,将 Java 固定为脚本语言。” ...这可能是我听过的最可怕的事情。 :)
  • @Carl,强类型不是为了安全,也不是为了你喜欢玩的其他闪亮饰品!只是为了美丽。
  • @Pavel:我在更一般的意义上使用“安全性”:这是我在编程中的人身安全问题,即它牵着我的手,充当护栏来防止我从类型相关的悬崖上掉下来。另见:Security blanket :)
【解决方案2】:

几年前,许多人惊讶地发现其中一门入门课程是使用 Haskell 作为编程语言来教授的!虽然我没有使用 Haskell 的经验,但我有一些 Lisp 和其他函数式编程语言的背景。

我认为这个轶事表明知识在你最不期望的时候是如何有用的。


更实际地说:您可能已经注意到 CPU 速度在几年前遇到了瓶颈,而现在提高计算机性能的最实用方法是安装多个 CPU。现在碰巧的是,您所知道的大多数(如果不是全部)编程语言本质上都是单任务的,并且受制于Von Neumann bottleneck。一个明显的解决方案是并行编程,但如果您的程序的并行部分最终共享状态(即内存),这可能会非常痛苦——这通常是这种情况。

事实证明,函数式编程是一种风格,可以让您在很大程度上规避共享状态的并行编程问题。换句话说,以 FP 风格编写“自然”线程安全且适合并行处理的程序是相当容易的。根据语言、编译器和硬件的不同,您甚至可能会发现(就像我最近所做的那样)程序的某些部分并行运行,而无需对并行性进行任何显式编码。

我经常错,但我的猜测是,随着并行编程变得越来越重要和越来越困难,函数式编程将成为未来的热门编程范式之一。 Haskell 可能不会成为首选语言——我个人目前最喜欢的是 Clojure——但看看一种或多种 FP 语言可能是值得的。

【讨论】:

  • 这个论点经常被提起,但根据我的经验,FP 的好处通常更多来自于降低复杂性而不是提高性能,这也适用于单线程程序。
【解决方案3】:

我也不认为我可以轻松地将一段 Haskell 代码插入游戏引擎。

如果你只想写 3D 游戏引擎,那么学习 Haskell 可能没有多大意义。

如果您想成为一名能够在多种范式中进行编程的全面程序员,并且您目前只了解类 C 语言,那么值得一看。

每次您学习一种新的非常不同的语言时,学习下一种语言都会变得更容易,因为您不仅要记住新的语法,而且还要学习不同的编程思维方式。如果您尝试一种新语言并看到一些新功能,如果您可以将它与您已经知道的语言的另一个功能联系起来,您将更快地理解它。您了解的语言越多,此新功能就越有可能与您之前看到的功能相似。

工具箱中有许多可用的工具也很方便。有些问题用一种语言比另一种更好地解决。如果您有 5 种不同类型的语言,那么您可以为每个问题选择最好的一种。如果您只知道 2 或 3 种非常相似的语言,那么有些问题会很容易解决,但有些问题可能比您使用更擅长该特定任务的语言更难解决。

【讨论】:

    【解决方案4】:

    如果您喜欢 3D 编程,您可能会对 Epic 创始人兼虚幻引擎技术总监 Tim Sweeney 题为 The Next Mainstream Programming Languages: A Game Developer's Perspective 的演讲中的一些幻灯片感兴趣。他在multiple times 的主题上发表过演讲,他显然对 Haskell 评价很高。

    【讨论】:

    • 非常有趣,感谢您的链接!
    【解决方案5】:

    你可以得到几样东西,主要是你思考事物的方式。例如,注意到什么是最小语言是很有趣的。如果你通过 SICP(同样的概念也适用于 Haskell),你会注意到你根本不需要循环语法。您不需要任何适用于较大结构的预定义函数。如果你有一个 cons 构造函数/解构函数,或者定义一个的方法,以及递归函数的能力,你可以定义几乎所有你需要的东西。您可以自己定义其他所有内容 - 这样做是一个有趣的练习。而这只是冰山一角。

    在更实际的层面上,例如,几周前我在做 OCaml 作业并抱怨“为什么这种 $%$%# 语言没有call/cc!?!”当我注意到自己在想什么时,我的头脑被震撼了——如果我不知道它是什么,我永远不会错过它,如果我不看一下 Scheme、Haskell,我也不知道它是什么。红宝石。

    你可以在 ICFP 比赛中找到很多很好的例子;真正让我惊叹的是this entrythis contest。他们在 Haskell 中创建了一种新语言来解决他们的问题。

    【讨论】:

    • +1 表示您渴望但无法拥有的语言功能。无知是一种幸福,所以只学习一种编程语言而忘记所有其他语言。他们会用罪恶的想法污染你的思想,但不能使用!
    【解决方案6】:

    学习一门函数式语言将与您习惯的语言发生很大的变化。 所以是的,你可能会学到一些有用的东西;)

    【讨论】:

    • 不幸的是,这正是 OP 不想要的答案类型 :)
    【解决方案7】:

    我会说,如果这是一件苦差事,请不要这样做。否则开始阅读this,你应该会在 10 00 万后看到你是否感到无聊或者你是否被抓住并且无法停止阅读它。

    【讨论】:

      【解决方案8】:

      像 Haskell 这样的函数式语言是一种不同的思考问题的方式。它们对于学习和教授数据结构和算法很有用,因为它们简化了这类问题。

      如果您使用 C++ 中的 STL,它的功能概念类似于 Haskell 和其他语言,因此了解 Haskell 将有助于理解 STL 的工作原理。

      如果您使用 XSL:T 来转换 XML,那么它的设计非常实用。

      【讨论】:

      • 我猜您将“功能性”与“声明性”混淆了。 XSLT 没有一阶函数,是吗?
      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 2023-03-10
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多