Haskell学什么语言?

作为我的第一门编程语言,我决定学习Haskell。 我是分析哲学专业,Haskell允许我快速正确地创建感兴趣的程序,例如自然语言分析的转换器,定理证明器和解释器。 尽管我只编写了两个半月的编程,但我发现Haskell的语义和语法比传统的命令式语言更容易学习,并且对其大部分结构感到舒适(现在)。

Haskell编程就像巫术一样,然而,我想扩大我对编程的知识。 我想选择一种新的编程语言来学习,但我没有足够的时间去选择一种任意的语言,放弃它,然后重复。 所以我想我会在这里提出这个问题,以及关于我正在寻找的语言类型的几个规定。 有些是主观的,有些旨在缓解Haskell的过渡。

  • 强类型系统。 Haskell编程中我最喜欢的部分之一是编写类型声明。 这有助于构建我对个人职能及其与整个计划的关系的思考。 它也使得我的程序的正确性更容易推理。 我关心的是正确性,而不是效率。
  • 强调递归而不是迭代。 我在Haskell中使用迭代构造,但递归地实现它们。 但是,理解递归函数的结构要比复杂的迭代过程容易得多,特别是在使用组合器和更高阶函数(如地图,折叠和绑定)的情况下。
  • 奖励学习。 Haskell是一种有益的语言,有点像阅读康德。 然而,我几年前与C的经历并非如此。 我不是在寻找C.语言应该强化一个概念上有趣的范例,在我完全主观的观点中,C-likes不这样做。
  • 权衡答案 :当然,这些只是笔记。 我只想回复给出格式正确的回复。 你一直很有帮助。

    1)几个回应表明,强调递归的静态类型语言意味着另一种功能语言。 虽然我想继续与Haskell强烈合作,但Camccann和larsmans正确地指出,另一种这样的语言将“缓解过渡太多”。 这些评论非常有帮助,因为我不打算在Caml编写Haskell! 在证明助理中,Coq和Agda看起来都很有趣。 特别是,Coq将为建构逻辑和形式类型理论提供一个坚实的介绍。 我花了一点时间用一阶谓词和模态逻辑(Mendellsohn,Enderton,一些Hinman),所以我可能会对Coq有很多乐趣。

    2)其他人非常青睐Lisp(Common Lisp,Scheme和Clojure)。 从我所收集的内容来看,Common Lisp和Scheme都有很好的介绍材料(On Lisp和The Reasoned Schemer,SICP)。 SICP中的材料使我倾向于Scheme。 特别是,通过SICP的计划将涵盖不同的评估策略,实施懒惰以及关注延续,口译员,符号计算等主题的机会。 最后,正如其他人所指出的,Lisp对代码/数据的处理将是全新的。 因此,我倾向于选择(2),一个Lisp。

    3)三,Prolog。 Prolog有很多有趣的材料,其主要领域正是我感兴趣的领域。它具有简单的语法,并且易于阅读。 目前我无法评论更多,但在阅读了Prolog的概述并略读了一些介绍性材料之后,它与(2)进行了排名。 而且似乎Prolog的回溯总是被黑客攻入Haskell!

    4)在主流语言中,Python看起来最有趣。 蒂姆耶茨使语言听起来非常有吸引力。 显然,Python经常被教给第一年的CS专业; 所以它在概念上很丰富或者易于学习。 我不得不做更多的研究。

    谢谢大家的建议! 它看起来像是一个Lisp(Scheme,Clojure),Prolog或像Coq或Agda这样的证明助手是推荐的主要语言。


    我想扩大我的编程知识。 (...)我想我会在这里提出这个问题,以及关于我正在寻找的语言类型的几个规定。 有些是主观的,有些旨在缓解Haskell的过渡。

    强类型系统。 (...)它也使我的程序的正确性非正式推理更容易。 我关心的是正确性,而不是效率。

    强调递归而不是迭代。 (......)

    恐怕你可能在这里缓解了一些过渡。 非常严格的类型系统和纯粹的功能风格是Haskell的特点,几乎任何类似于主流编程语言的东西都需要对其中的一种进行妥协。 所以,考虑到这一点,以下是一些广泛的建议,旨在保留Haskell的大部分内容,但有一些重大转变。

  • 忽视实用性并选择“Haskell比Haskell更多” :由于非终结和其他凌乱的妥协,Haskell的类型系统充满了漏洞。 清理混乱并添加更强大的功能,并获得像CoqAgda这样的语言,其中函数的类型包含其正确性的证明(甚至可以读取函数箭头->作为逻辑含义!)。 这些语言已被用于数学证明和具有极高正确性要求的程序。 Coq可能是该风格中最突出的语言,但Agda拥有更多Haskell-y的感觉(以及在Haskell本身编写的)。

  • 无视类型,增加更多魔力 :如果Haskell是巫术, Lisp是创造的原始魔力。 Lisp-family语言(包括SchemeClojure )具有极其灵活的极致风格和极简主义。 这些语言基本上没有语法,直接以树数据结构的形式编写代码; 在Lisp中进行元编程比在某些语言中使用非元编程更容易。

  • 妥协一点,向主流方向靠拢 :Haskell属于受ML严重影响的各种语言,其中任何一种你都可以在没有太多困难的情况下进行转换。 Haskell是关于类型和功能风格使用的正确性保证的最严格的方法之一,其他方面往往是混合风格和/或出于各种原因做出务实的妥协。 如果您想要接触OOP并访问大量主流技术平台,JVM上的Scala或.NET上的F#都与Haskell有许多共同之处,同时提供了与Java和.NET平台的简单互操作性。 F#由Microsoft直接支持,但与Haskell相比有一些令人讨厌的局限性,并且在非Windows平台上存在可移植性问题。 Scala直接与Haskell的类型系统和Java的跨平台潜力相对应,但是它具有更重的语法,并且缺乏F#享有的强大的第一方支持。

  • 其他答案中也提到了其中的大部分建议,但希望我的理由能够提供一些启示。


    我将成为那个家伙,并建议你要求错误的事情。

    首先你说你想扩大你的视野。 然后你描述你想要的那种语言,它的视野听起来非常像你已经拥有的视野。 通过反复学习相同的东西,你不会获得太多收益。

    我建议你学习一个Lisp - 即Common Lisp,Scheme /球拍或Clojure。 它们都是默认动态类型,但具有某种类型的提示或可选的静态类型。 球拍和Clojure可能是你最好的投注。

    Clojure更新近,Haskellisms更像默认的不变性和大量的懒惰评估,但它基于Java虚拟机,这意味着它有一些奇怪的瑕疵(例如JVM不支持tail call消除,所以递归是种类的的黑客)。

    球拍年龄要大得多,但是在这个过程中已经获得了很多力量,比如静态类型支持和关注函数式编程。 我想你可能会从球拍中获得最大收益。

    Lisps中的宏观系统非常有趣,而且比其他任何地方都更加强大。 这至少是值得一看的。


    从适合您的专业的角度来看,显而易见的选择看起来像一个逻辑语言,如Prolog或其衍生物。 逻辑编程可以用一种功能性语言非常整齐地完成(参见例如The Reasoned Schemer),但您可能喜欢直接使用逻辑范例。

    一个互动的定理证明系统,如twelf或coq也可能会引起你的幻想。

    链接地址: http://www.djcxy.com/p/80773.html

    上一篇: What language to learn after Haskell?

    下一篇: Haskell counted list type