作为我的第一门编程语言,我决定学习Haskell。我是一个分析哲学专业,Haskell允许我快速正确地创建感兴趣的程序,例如,用于自然语言解析的传感器,定理证明器和解释器。虽然我只编写了两个半月的编程,但我发现Haskell的语义和语法比传统的命令式语言更容易学习,并且(现在)对其大多数构造感到舒服。
然而,Haskell中的编程就像巫术一样,我想扩展我对编程的了解。我想选择一种新的编程语言来学习,但我没有足够的时间来学习任意语言,删除它并重复。所以我想我会在这里提出问题,以及关于我正在寻找的语言类型的几个规定。有些是主观的,有些是为了缓解从Haskell的过渡。
称重答案:当然,这些只是笔记。我只想回复所有给出良好反应的人。你一直非常乐于助人。
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 的Scheme将涵盖不同的评估策略,懒惰的实现,以及关注诸如延续,解释器,符号计算等主题的机会。最后,正如其他人所指出的那样,Lisp对代码/数据的处理将是全新的。因此,我倾向于选择(2),一个Lisp。
3)第三,Prolog。 Prolog有很多有趣的材料,它的主要域正是我感兴趣的。它具有简单的语法并且易于阅读。我现在无法评论更多,但在阅读了Prolog的概述并浏览了一些介绍材料之后,它排名为(2)。似乎Prolog的回溯总是被黑客入侵Haskell!
4)在主流语言中,Python看起来最有趣。蒂姆耶茨使这些语言听起来非常吸引人。显然,Python经常被教给第一年的CS专业;所以它要么在概念上丰富,要么易于学习。我必须做更多的研究。
谢谢大家的推荐!看起来像Lisp(Scheme,Clojure),Prolog或者像Coq或Agda这样的证明助手是推荐的主要语言。
答案 0 :(得分:85)
我想拓宽我对编程的了解。 (...)我想我会在这里提出问题,以及关于我正在寻找的语言类型的几个规定。有些是主观的,有些是为了缓解从Haskell的过渡。
强类型系统。 (...)它还使我的程序的正确性非正式地推理。我关心的是正确性,而不是效率。
强调递归而不是迭代。 (...)
你可能会在这里放松过度,我担心。非常严格的类型系统和纯粹的功能风格是Haskell的特征,几乎任何类似于主流编程语言的东西都需要至少在某些方面妥协。所以,考虑到这一点,这里有一些广泛的建议,旨在保留你似乎喜欢Haskell的大多数,但有一些重大转变。
忽视实用性并选择“比Haskell更多的Haskell”:由于不确定和其他混乱的妥协,Haskell的类型系统充满漏洞。清理混乱并添加更强大的功能,您可以获得 Coq 和 Agda 等语言,其中函数的类型包含其正确性的证明(您甚至可以阅读函数箭头) ->
作为逻辑含义!)。这些语言已用于数学证明和具有极高正确性要求的程序。 Coq可能是这种风格中最突出的语言,但Agda有更多的Haskell-y感觉(以及用Haskell本身编写)。
无视类型,添加更多魔法:如果Haskell是巫术, Lisp 是创造的原始,原始魔力。 Lisp系列语言(包括 Scheme 和 Clojure )具有几乎无与伦比的灵活性和极端极简主义。这些语言基本上没有语法,直接以树数据结构的形式编写代码;在某些语言中,Lisp中的元编程比非元编程更容易。
妥协并接近主流:Haskell属于受ML严重影响的广泛语系,任何你可能在没有的情况下转移到< / em>很难。 Haskell是功能风格类型和使用的正确性保证中最严格的一种,其他的通常是混合风格和/或出于各种原因做出务实的妥协。如果您想要接触OOP并访问许多主流技术平台,那么JVM上的 Scala 或.NET上的 F#与Haskell有很多共同点,同时提供简单易用的功能与Java和.NET平台的互操作性。微软直接支持F#,但与非Windows平台上的Haskell和可移植性问题相比,它有一些烦人的限制。 Scala直接与更多Haskell类型系统和Java的跨平台潜力相对应,但语法更加重量级,缺乏F#所享有的强大的第一方支持。
其他答案中也提到了大多数这些建议,但希望我的理由可以提供一些启示。
答案 1 :(得分:20)
我将成为那个家伙并建议你提出错误的事情。
首先,你说你想开阔你的视野。然后你描述了你想要的那种语言,它的视野听起来就像你已经拥有的视野一样。通过一遍又一遍地学习同样的东西,你不会获得太多收获。
我建议你学习一个Lisp--即Common Lisp,Scheme / Racket或Clojure。它们都是默认动态类型,但具有某种类型提示或可选的静态类型。球拍和Clojure可能是你最好的赌注。
Clojure更新,并且有更多的Haskellism,比如默认的不变性和大量的懒惰评估,但它基于Java虚拟机,这意味着它有一些奇怪的瑕疵(例如JVM不支持尾部呼叫消除,所以递归是一种黑客攻击)。
Racket年龄更大,但在此过程中已经获得了很多力量,例如静态类型支持和对功能编程的关注。我想你可能会从Racket中获得最大的收益。
Lisps中的宏系统非常有趣,并且比你在其他地方看到的任何东西都强大得多。仅这一点至少值得关注。
答案 2 :(得分:19)
从适合您的专业的角度来看,显而易见的选择似乎是一种逻辑语言,如Prolog或其衍生物。逻辑编程可以用函数式语言非常巧妙地完成(参见例如The Reasoned Schemer),但您可能喜欢直接使用逻辑范例。
交互式定理证明系统,如twelf或coq,也可能会引起你的兴趣。
答案 3 :(得分:18)
我建议你学习Coq,这是一个强大的证明助手,其语法让Haskell程序员感到舒服。关于Coq的酷炫之处在于它可以被提取到其他功能语言,包括Haskell。 Hackage上甚至有一个包(Meldable-Heap)用Coq编写,有关其操作的属性,然后提取到Haskell。
另一种提供比Haskell更强大功能的流行语言是Agda - 我不知道Agda不知道它是依赖于Hackage的类型,并且受到我尊重的人的尊重,但这些都是足够的理由我
我不希望其中任何一个变得容易。但是如果你知道 Haskell并且希望继续使用比Haskell类型系统更强大的语言,那么应该考虑它们。
答案 4 :(得分:11)
由于除了你的主观兴趣之外你没有提到任何限制并且强调'奖励学习'(好吧,好吧,我会忽略静态输入限制),我建议学习几种不同范式的语言,并且优选地,对于它们中的每一个都是“示范性的”。
特别是Lisps(CL不如Scheme)和Prolog(和Haskell)包含递归。
虽然我不是这些语言中的任何一个大师,但我确实花了一些时间在他们每个人身上,除了Erlang和Forth,他们都给了我大开眼界和有趣的学习经历,因为每个人都接近解决问题不同的角度。
所以,虽然看起来好像我忽略了你没有时间尝试几种语言的部分,我宁愿认为花在任何这些上面的时间都不会浪费,你应该看看所有的它们。
答案 5 :(得分:10)
如果你想要一个强大的(呃)类型的Prolog,Mercury是一个有趣的选择。我过去曾涉足过它,我喜欢它给我的不同观点。它还有类型系统中的moded-ness(哪些参数需要自由/固定)和确定性(有多少结果?)。
Clean与Haskell非常相似,但具有唯一性类型,可用作Monads的替代(更具体地说,IO monad)。唯一性输入也有助于处理数组。
答案 6 :(得分:10)
stack-oriented programming language怎么样? Cat击中你的高点。它是:
博士。 Dobbs在2008年发表了关于Cat的short article,尽管语言略有改变。
答案 7 :(得分:9)
我有点迟了但是我发现没有人提到过几种范式和相关语言,这些范例和相关语言可以让你感兴趣的是它们的高级抽象和通用性:
答案 8 :(得分:8)
我会推荐你Erlang。它不是强类型语言,你应该尝试一下。这是一种非常不同的编程方法,您可能会发现存在强类型不是最佳工具(TM)的问题。无论如何,Erlang为您提供静态类型验证(typer,dialyzer)的工具,您可以在从中获益的部分使用强类型。它可以为你带来有趣的体验,但要做好准备,感觉会有很大不同。如果您正在寻找“概念上有趣的范例”,您可以在Erlang中找到它们,消息传递,内存分离而不是共享,分发,OTP,错误处理和错误传播,而不是错误“预防”等等。 Erlang可能与您目前的经历相距甚远,但如果您有C和Haskell的经验,他们仍然会大发痒。
答案 9 :(得分:8)
根据您的描述,我建议 Ocaml 或 F#。
ML系列在强类型系统方面通常非常好。强调递归和模式匹配也很清楚。
我对奖励学习部分有点犹豫不决。毫无疑问,学习它们对我来说是有益的。但是考虑到你的限制和对你想要的描述,你似乎并没有真正寻找与Haskell有更多不同的东西。
如果您没有设置限制,我会建议 Python 或 Erlang ,这两种情况都会让您离开舒适区。
答案 10 :(得分:8)
尽管它未能满足您的一个重要标准(静态*打字),但我将为Python提供一个案例。以下是我认为你应该看一下的几个原因:
我知道你是否正在寻找别的东西。例如,正如其他人所建议的那样,逻辑编程可能正好在你的小巷里。
*我认为你的意思是静态输入,因为你想声明类型。从技术上讲,Python 是一种强类型语言,因为你不能随意将字符串解释为数字。有趣的是,Python衍生产品允许静态输入,例如Boo。
答案 11 :(得分:6)
根据我的经验,强类型+强调递归意味着另一种函数式编程语言。然后,我想知道这是否非常有益,因为它们都不像Haskell那样“纯粹”。
正如其他海报所暗示的那样,Prolog和Lisp / Scheme都很不错,即使它们都是动态类型的。许多有着强烈理论“品味”的好书已经出版了关于Scheme的特别。看看SICP,它也传达了许多一般的计算机科学智慧(元循环翻译等)。
答案 12 :(得分:6)
Factor将是一个不错的选择。
答案 13 :(得分:5)
如果您决定偏离您对类型系统的偏好,您可能会对J编程语言感兴趣。它如何强调功能构成非常出色。如果你喜欢Haskell中的无点风格,J的默契形式将是有益的。我发现它非常引人深思,特别是在语义方面。
没错,它不适合你对你喜欢什么的先入之见,但请看一看。只知道它在那里是值得发现的。完整实现的唯一来源是J Software,jsoftware.com。
答案 14 :(得分:5)
您可以开始研究Lisp。
Prolog也是一种很酷的语言。
答案 15 :(得分:0)
使用其中一个主流。鉴于可用资源,您的技能的未来适销性,丰富的开发人员生态系统,我认为您应该从 Java 或 C#开始。
答案 16 :(得分:0)
很棒的问题 - 在我花了几个月的时间彻底享受Haskell后,我最近一直在问自己,尽管我的背景非常不同(有机化学)。
和你一样,C及其同类产品是不可能的。
我一直在使用Python和Ruby作为今天两种实用的主要脚本语言(mules?),它们都有一些功能组件让我高兴。没有在这里开始任何Rubyist / Pythonist辩论,但我个人务实的答案是:
了解您首先要借口申请的那个(Python或Ruby)。