Haskell学什么语言?

作为我的第一个编程语言,我决定学习Haskell。 我是一个分析哲学专业,Haskell允许我快速正确地创build感兴趣的程序,例如,用于自然语言分析的转换器,定理certificate器和解释器。 虽然我只编程了两个半月,但我发现Haskell的语义和语法要比传统的命令式语言更容易学习,而且对于大多数的构造来说,现在感觉很舒服。

Haskell编程就像魔法一样,但是我想扩大编程知识。 我想select一种新的编程语言来学习,但我没有足够的时间去select一种任意的语言,放弃它,然后重复。 所以我想我会在这里提出这个问题,以及关于我正在寻找的语言types的几个规定。 有些是主观的,有些是为了缓解从哈斯克尔的过渡。

  • 强types系统。 Haskell编程中我最喜欢的部分之一是编写types声明。 这有助于构build我对个人职能及其与整个计划关系的思考。 这也使我的程序的正确性非正式的推理更容易。 我关心的是正确性,而不是效率。
  • 强调recursion而不是迭代。 我在Haskell中使用迭代构造,但recursion地实现它们。 但是,理解recursion函数的结构要比复杂的迭代过程容易得多,特别是在使用组合器和更高阶函数(如地图,折叠和绑定)的情况下。
  • 奖励学习。 Haskell是一个有用的语言,有点像阅读康德。 几年前我和C的经验不是。 我不是在寻找C.语言应该强化一个概念上有趣的范式,在我完全主观的意见中,C-like不这样做。

衡量答案 :当然,这些只是笔记。 我只想回答所有给予答复的人。 你一直很有帮助。

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

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

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

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

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

我想扩大我的编程知识。 (…)我想我会在这里提出这个问题,以及关于我正在寻找的语言types的几个规定。 有些是主观的,有些是为了缓解从哈斯克尔的过渡。

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

强调recursion而不是迭代。 (……)

恐怕你可能在这里稍微松了一点过渡。 非常严格的types系统和纯粹的function风格是Haskell的特点,几乎所有类似于主stream编程语言的东西都需要在其中一个方面做出妥协。 所以,考虑到这一点,下面是几个广泛的build议,旨在保留Haskell的大部分内容,但有一些重大转变。

  • 无视实用性,去“Haskell比Haskell更多” :Haskell的types系统充满了漏洞,由于非终结和其他凌乱的妥协。 清理乱七八糟,添加更多强大的function,你会得到像CoqAgda这样的语言,其中一个函数的types包含了它的正确性certificate(甚至可以阅读函数arrow ->作为逻辑蕴涵!)。 这些语言已被用于mathcertificate和具有极高正确性要求的程序。 Coq可能是该风格中最突出的语言,但是Agda拥有更多的Haskell-y感觉(以及Haskell自己写的)。

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

  • 妥协一点,接近主stream :Haskell属于受ML严重影响的各种语言,你可能没有太多的困难转移到Haskell。 Haskell在从types和function风格的使用中获得正确性保证时是最严格的,其他types经常是混合风格和/或由于各种原因而做出务实的妥协。 如果您想要接触OOP并访问大量主stream技术平台,则JVM上的Scala或.NET上的F#与Haskell有许多相同之处,同时提供与Java和.NET平台的简单互操作性。 F#直接由微软支持,但与Haskell相比有一些令人讨厌的局限性,在非Windows平台上有可移植性问题。 Scala直接与Haskell的types系统和Java的跨平台潜力相对应,但具有更重的语法,缺乏F#所拥有的强大的第一方支持。

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

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

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

我build议你学习Lisp,即Common Lisp,Scheme / Racket或Clojure。 他们都默认dynamictypes,但function某种types的提示或可选的静态types。 球拍和Clojure可能是你最好的select。

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

球拍年龄要大得多,但是一路走来,还是拿起了很多力量,比如静态types支持和function编程。 我想你可能会从球拍中获得最大收益。

Lisps中的macros观系统非常有趣,比其他任何地方都强大得多。 这至less是值得一看的。

从适合你的专业的angular度来看,显而易见的select似乎是一种逻辑语言,如Prolog或其衍生物。 逻辑编程可以用一种function语言非常整齐地完成(参见例如The Reasoned Schemer ),但是你可能喜欢直接使用逻辑范例。

一个互动的定理certificate系统,比如两个或者coq也可能会引起你的幻想。

我build议你学习Coq ,这是一个强大的certificate助手,语法会让Haskell程序员感到舒服。 关于Coq的很酷的事情是它可以被提取到其他函数语言,包括Haskell。 Hackage上甚至还有一个软件包( Meliled-Heap ),这个软件包是用Coq编写的,其性能已经被certificate可以运行,然后提取给Haskell。

另一种比Haskell更能提供强大function的stream行语言是Agda–我不知道Agda是否知道它是在Hackage上依赖input的,并且受到我尊敬的人们的尊重,但这些对我来说是足够好的理由。

我不希望这些都很容易。 但是如果你知道 Haskell,并且希望向Haskelltypes系统提供更多function的语言,那么应该考虑它们。

除了你的主观兴趣外,你没有提到任何限制,强调“奖励学习”(好吧,我会忽略静态types限制),我会build议学习一些不同范式的语言,对他们每个人都是“模范”的。

  • 一个Lisp方言的代码为数据/ homoiconicity的东西,因为他们是好的,如果不是最好的,dynamic(或多或less)function的编程语言的例子
  • Prolog作为主要的逻辑编程语言
  • Smalltalk是一种真正的面向对象语言(由于其通常极其以图像为中心的方法,所以也很有趣)
  • 也许是Erlang或者Clojure,如果你对伪造并行/并行/分布式编程的语言感兴趣的话
  • 面向堆栈编程
  • Haskell为严格的function静态types懒惰编程)

特别是Lisps(CL不如Scheme)和Prolog(和Haskell)拥抱recursion。

尽pipe我不是这些语言的大师,但是我确实花了一些时间和他们一起,除了Erlang和Forth,他们都给了我开眼界和有趣的学习经验,因为每个人都从不同的angular度来解决问题。

所以,尽pipe看起来好像我没有时间去尝试几种语言,但我宁愿认为花在这些上面的时间也不会浪费,你应该看看所有这些。

如何面向堆栈的编程语言 ? 猫打你的高点。 它是:

  • 静态键入types推断。
  • 使你重新思考常见的命令式语言概念,如循环。 条件执行和循环由组合器处理。
  • 奖励 – 迫使你理解另一种计算模式。 给你另一种思考和分解问题的方式。

多布斯博士在2008年发表了一篇关于猫的简短文章 ,尽pipe语言略有改变。

如果你想要一个强大的(er)型的Prolog, 水星是一个有趣的select。 过去我已经涉足了,我喜欢它给我的不同视angular。 它在模型系统中也具有模型性(参数需要自由/固定)和确定性(有多less结果?)。

Clean与Haskell非常相似,但具有唯一性打字function,可用作Monad(更具体地说,IO monad)的替代方法。 唯一性键入也可以处理数组。

我有点晚了,但是我发现没有人提到过一些可以让你感兴趣的范式和相关语言的高级抽象和普遍性:

  • 重写系统 ,比如Maude或者ELAN ;
  • 约束处理规则(CHR) 。

尽pipe未能满足你的一个重要标准(静态键入),但我还是要为Python做一个例子。 以下是我认为你应该看看它的一些原因:

  • 对于命令式语言来说,这是令人惊讶的function。 当我知道这件事时,这是我感到震惊的事情之一。 以列表parsing为例。 它具有lambdas,一stream的function,以及迭代器(地图,折叠,拉链…)上的许多function灵感组合。 它给你select最适合问题的范例。
  • 恕我直言,就像Haskell一样,编码很漂亮。语法简单而优雅。
  • 它有一种专注于直接做事的文化,而不是过于注重效率。

我明白,如果你正在寻找别的东西。 例如,逻辑编程可能就像其他人所build议的那样。


*我假设你的意思是在这里静态键入,因为你想声明的types。 从技术上讲,Python 一种强types语言,因为你不能任意解释一个string作为数字。 有趣的是,Python衍生工具允许静态types,比如Boo 。

我会推荐你​​二郎。 这不是强types的语言,你应该尝试一下。 这是非常不同的编程方法,您可能会发现,强打字不是The Best Tool(TM)的问题。 无论如何,Erlang为您提供静态typesvalidation(typer,dialyzer)的工具,您可以使用强大的打字function来从中获益。 对你来说可以是有趣的经验,但要做好准备,这将是非常不同的感觉。 如果你正在寻找“概念上有趣的范例”,你可以在Erlang中发现它们,消息传递,内存分离而不是共享,分发,OTP,error handling和错误传播而不是错误“预防”等等。 Erlang可能离你目前的经验还很远,但是如果你有C和Haskell的经验的话,Erlang还是会让人挠痒痒的。

鉴于你的描述,我会build议OcamlF#

ML系列在强大的系统方面通常非常好。 recursion的重点,加上模式匹配,也是很清楚的。

我有点犹豫在学习的部分。 学习他们毫无疑问是对我的回报。 但是考虑到你的限制和对你想要的描述,看起来你实际上并没有在寻找比Haskell更加不同的东西。

如果你没有把你的限制,我会build议PythonErlang ,这两者都会把你带出你的舒适区。

根据我的经验,强types+强调recursion意味着另一种函数式编程语言。 再一次,我想知道这是否是非常有价值的,因为它们都不会像Haskell那样“纯粹”。

正如其他海报所build议的,Prolog和Lisp / Scheme很好,即使它们都是dynamictypes的。 特别是已经出版了许多有很强的理论“味道”的优秀书籍。 看看SICP ,它也传达了很多一般的计算机科学智慧(meta-circular interpreters等)。

因素将是一个不错的select。

你可以开始研究Lisp 。

Prolog也是一种很酷的语言。

如果你决定偏离一个types系统的偏好,你可能会对J编程语言感兴趣。 如何强调function组合是突出的。 如果你喜欢Haskell中的无点式,那么J的默认forms将是有益的。 我发现它特别引人注目,特别是在语义方面。

诚然,这不符合你的想法,但看看它。 只要知道它是在外面值得发现。 完整实现的唯一来源是J Software,jsoftware.com。

去与主stream之一。 鉴于可用的资源,未来的技能市场化,丰富的开发人员生态系统,我认为您应该从JavaC#开始

很好的问题 – 最近我花了几个月的时间仔细研究Haskell,尽pipe我的背景很不一样(有机化学)。

像你一样,C之stream也是不可能的。

我一直在Python和Ruby之间摇摆,将它们作为两种实用的主力脚本语言(mules?),它们都具有一些function组件,以保持我的快乐。 这里没有开始任何Rubyist / Pythonist辩论,但是我对这个问题的个人实际的回答是:

学习一个(Python或Ruby),你首先得到一个借口申请。