代码之家  ›  专栏  ›  技术社区  ›  emi

哈斯克尔之后要学什么语言?[关闭]

  •  85
  • emi  · 技术社区  · 16 年前

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

    • 强型系统。在Haskell编程中,我最喜欢的部分之一是编写类型声明。这有助于构建我对单个函数及其与整个程序的关系的想法。这也使得非正式地推理我的程序的正确性变得更容易。我关心的是正确性,而不是效率。
    • 强调递归而不是迭代。我在Haskell中使用迭代构造,但是递归地实现它们。然而,理解递归函数的结构要比复杂的迭代过程容易得多,特别是在使用组合子和高阶函数(如映射、折叠和绑定)时。
    • 值得学习。哈斯克尔是一个 奖励

    权衡答案 :当然,这些只是笔记。我只想回答每一个给出合理答案的人。你帮了大忙。

    1) 一些回答表明,强调递归的强静态类型语言意味着另一种函数语言。虽然我想继续与Haskell紧密合作,但camccann和larsmans正确地指出,另一种这样的语言将“大大简化过渡”。这些评论非常有用,因为我不打算用Caml来写Haskell!在证明助理中,Coq和Agda看起来都很有趣。特别是,Coq将提供一个坚实的介绍建设性逻辑和形式类型理论。我花了一点时间研究一阶谓词和模态逻辑(Mendellsohn,Enderton,Hinman的一些),所以我可能会对Coq很感兴趣。

    关于Lisp 和 理性的阴谋家 , SICP公司 ). 中的材料 SICP公司 SICP公司

    3) 第三,序言。Prolog有大量有趣的素材,而且 初级的 域名正是我感兴趣的领域。它语法简单,易于阅读。我现在不能多加评论,但是在阅读了Prolog的概述和略读了一些介绍性材料之后,它与(2)排在了一起。而且似乎Prolog的回溯总是被黑客侵入Haskell!

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

    17 回复  |  直到 12 年前
        1
  •  85
  •   Community Mohan Dere    6 年前

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

    恐怕你在这方面的转变太过缓和了。非常严格的类型系统和纯粹的函数式风格是Haskell的特点,几乎任何类似主流编程语言的东西都需要至少在其中一个方面有所妥协。因此,考虑到这一点,这里有一些广泛的建议,旨在保留 最 你似乎喜欢哈斯克尔的地方,但有一些重大转变。

    • 忽视实用性,追求“比哈斯凯尔更多的哈斯凯尔” :Haskell的类型系统充满了漏洞,这是由于非终结和其他混乱的妥协。清理混乱,添加更强大的功能,你会得到像这样的语言 二氧化碳 和 阿格达 -> 作为逻辑含义!)。这些语言已被用于数学证明和具有极高正确性要求的程序。Coq可能是最突出的语言风格,但Agda有一个更Haskell-y的感觉(以及被写在Haskell本身)。

    • 忽略类型,添加更多魔法 :如果哈斯克尔是巫师, 口齿不清 是造物的原始魔力。Lisp族语言(也包括 方案 克洛朱尔

    • 妥协一点,向主流靠拢 :Haskell属于受ML影响很大的一大类语言,任何一种语言都可能不受ML的影响 太 在JVM或

    这些建议中的大多数也在其他答案中提到,但希望我的理由能提供一些启示。

        2
  •  20
  •   Chuck    16 年前

    首先你说你想开阔你的视野。然后你描述你想要的语言,它的视界听起来像你已经拥有的视界。一次又一次地学习同样的东西,你不会有什么收获。

    我建议你学习Lisp,即commonlisp,Scheme/Racket或Clojure。默认情况下,它们都是动态类型的,但具有某种类型暗示或可选的静态类型。球拍和Clojure可能是你最好的选择。

    Clojure 是最近的,有更多的haskellists,比如默认的不变性和大量的延迟计算,但是它基于Java虚拟机,这意味着它有一些奇怪的缺点(例如JVM不支持尾部调用消除,所以递归是一种黑客行为)。

    Racket 它的历史要老得多,但在这一过程中获得了很多功能,比如静态类型支持和对函数式编程的关注。我想你可能会从球拍中得到最大的收获。

    Lisps中的宏系统非常有趣,比其他任何地方看到的都强大得多。这一点至少值得一看。

        3
  •  19
  •   sclv    16 年前

    从适合你专业的角度来看,最明显的选择似乎是一种逻辑语言,如Prolog或其派生语言。逻辑编程可以非常巧妙地用函数式语言完成(参见。 The Reasoned Schemer ),但您可能喜欢直接使用逻辑范式。

        4
  •  18
  •   Thomas M. DuBuisson    16 年前

    我建议你学习 Coq ,这是一个强大的证明助手,语法让Haskell程序员感到舒服。Coq最酷的地方是它可以被提取到其他函数式语言中,包括Haskell。甚至还有一个包裹( Meldable-Heap )关于用Coq编写的Hackage,已经证明了其操作的属性,然后提取到Haskell。

    Agda

    我想这两个都不容易。但是如果你 知道 如果Haskell想要发展一种比Haskell类型系统更强大的语言,那么就应该考虑它们。

        5
  •  11
  •   danlei    16 年前

    因为除了你的主观兴趣之外,你没有提到任何限制,并且强调“值得学习”(好吧,好吧,我将忽略静态类型限制),我建议你学习几种不同范例的语言,最好是对每种范例都“示范”的语言。

    • A 口齿不清 作为数据/同象性事物的代码的方言,因为它们是好的,如果不是最好的,动态(或多或少严格)函数式编程语言的例子
    • 作为主流的逻辑程序设计语言
    • 闲话
    • 也许 吧 二郎 克洛朱尔 如果你对并发/并行/分布式编程语言感兴趣
    • 面向堆栈编程
    • ( 哈斯克尔

    尤其是Lisps(CL不如Scheme)和Prolog(以及Haskell)支持递归。

    因此,虽然我似乎忽略了你没有时间尝试几种语言的部分,但我认为花在这些语言上的时间不会被浪费,你应该看看所有的语言。

        6
  •  10
  •   Corbin March    16 年前

    来一杯怎么样 stack-oriented programming language Cat 达到你的最高点。它是:

    • 使用类型推断静态类型化。
    • 使您重新思考常见的命令式语言概念,如循环。条件执行和循环是用 combinators
    • 奖励-迫使你理解另一种计算模型。给你另一种思考和分解问题的方法。

    多布斯博士发表了一篇论文 short article 2008年关于猫的报道,尽管语言略有变化。

        7
  •  10
  •   yatima2975    16 年前

    如果你想要一个强类型的序言, Mercury 是个有趣的选择。我以前也涉足过,我喜欢它给我的不同视角。它还具有模式性(哪些参数需要自由/固定)和确定性(有多少个结果?)在类型系统中。

    Clean 与Haskell非常相似,但具有唯一性类型,可以作为monad(更具体地说,是IO monad)的替代。唯一性类型在处理数组方面也做了一些有趣的事情。

        8
  •  9
  •   MaD70    16 年前

    我有点晚了,但是我发现没有人提到过一些范例和相关的语言,这些范例和语言的高度抽象性和通用性让你感兴趣:

        9
  •  8
  •   Tim Yates    16 年前

    • 对于祈使式语言,它的功能惊人。这是我学到的东西之一。采取 list comprehensions
    • 嗯,就像哈斯凯尔一样,代码很漂亮。语法简单而优雅。
    • 它的文化注重以直截了当的方式做事,而不是过于注重效率。

    如果你想找别的东西,我能理解。例如,正如其他人所建议的那样,逻辑编程可能正适合你。


    *我假设您在这里指的是静态类型,因为您要声明类型。从技术上讲,Python 一种强类型语言,因为你不能任意解释,比如说,一个字符串作为一个数字。有趣的是,有一些Python衍生工具允许静态类型,比如 Boo .

        10
  •  8
  •   Hynek -Pichi- Vychodil Paulo Suassuna    16 年前

        11
  •  8
  •   Muhammad Alkarouri    16 年前

    根据你的描述,我建议 Ocaml F级# .

    ML系列在强类型系统方面通常是非常好的。对递归和模式匹配的强调也很清楚。

    值得学习 部分。毫无疑问,学习它们对我是有好处的。但是考虑到你的限制和你对你想要的东西的描述,看起来你实际上并没有在寻找比Haskell更不同的东西。

    蟒蛇 两者都会让你走出舒适区。

        12
  •  6
  •   Fred Foo    16 年前

    根据我的经验,强类型+强调递归意味着另一种函数式编程语言。再说一次,我想知道这是不是很值得,因为他们中没有一个会像哈斯克尔那样“纯洁”。

    正如其他海报所建议的,Prolog和Lisp/Scheme都很不错,尽管它们都是动态类型的。许多对他们有很强理论“品味”的伟大著作已经出版,特别是关于计划的。看一看 SICP ,这也传达了许多通用的计算机科学智慧(元循环解释器等)。

        13
  •  6
  •   leolao    16 年前

    Factor 是个不错的选择。

        14
  •  5
  •   user454497 user454497    16 年前

    Lisp .

    Prolog也是一种很酷的语言。

        15
  •  5
  •   kaleidic    16 年前

    如果您决定偏离您对类型系统的偏好,那么您可能会对J编程语言感兴趣。它突出表现在如何强调功能组合。如果你喜欢Haskell的无点风格,J的默契形式将是有益的。我发现它非常发人深省,尤其是在语义方面。

    诚然,它不符合你的先入之见,你想要什么,但看看它。仅仅知道它就在那里是值得去发现的。完整实现的唯一来源是J软件,jsoftware.com网站.

        16
  •  0
  •   Tola    16 年前

    Java 或 .

        17
  •  0
  •   jdo    16 年前

    好问题——虽然我的背景很不一样(有机化学),但在花了几个月的时间彻底享受哈斯克尔之后,我最近自己也在问这个问题。

    像你一样,C和它的同类是不可能的。

    推荐文章