作为我的第一门编程语言,我决定学习Haskell。我是分析哲学专业的学生,Haskell允许我快速而正确地创建感兴趣的程序,例如,用于自然语言解析的转换器、定理证明器和解释器。尽管我只做了两个半月的编程,但我发现Haskell的语义和语法比更传统的命令式语言更容易学习,并且(现在)对它的大部分构造感到很舒服。
然而,在Haskell中编程就像巫术一样,我想扩展我的编程知识。我想选择一种新的编程语言来学习,但我没有足够的时间去选择一种任意的语言,放弃它,然后重复。因此,我想我应该在这里提出这个问题,以及关于我正在寻找的语言类型的几个规定。有些是主观的,有些是为了简化从Haskell的过渡。
权衡答案:当然,这些只是笔记。我只想回复每个给出格式良好的回复的人。你已经帮个我不少忙了。
1)一些回答表明,强调递归的强静态类型语言意味着另一种函数式语言。虽然我希望继续与Haskell进行强有力的合作,但camccann和larsman正确地指出,另一种这样的语言将“大大简化过渡”。这些评论非常有用,因为我不打算用Caml编写Haskell!在证明助手中,Coq和Agda看起来都很有趣。特别是,Coq将提供对构造逻辑和形式化类型理论的坚实介绍。我花了一些时间研究一阶谓词和模态逻辑(Mendellsohn,Enderton,一些Hinman),所以我可能会从Coq中获得很多乐趣。
2)其他人非常喜欢Lisp (Common Lisp,Scheme和Clojure)。据我所知,Common Lisp和Scheme都有很好的入门材料(关于Lisp和推理Schemer,SICP)。SICP中的材料使我倾向于Scheme。特别是,通过SICP的Scheme将涵盖不同的评估策略,懒惰的实现,以及专注于延续、解释器、符号计算等主题的机会。最后,正如其他人所指出的,Lisp对代码/数据的处理将是全新的。因此,我非常倾向于选项(2),一种Lisp。
3)第三,Prolog。Prolog有大量有趣的资料,它的主要领域正是我感兴趣的领域。它有一个简单的语法,易于阅读。目前我不能发表更多评论,但在阅读了Prolog的概述并浏览了一些介绍性材料后,它与(2)排名相同。而且似乎Prolog的回溯总是被黑客入侵到Haskell!
4)在主流语言中,Python看起来最有趣。Tim Yates让这些语言听起来很有吸引力。显然,Python通常被教授给CS专业的一年级学生;因此,它要么概念丰富,要么易于学习。我得做更多的研究。
感谢大家的推荐!它看起来像Lisp (Scheme,Clojure),Prolog,或者像Coq或Agda这样的证明助手是主要的推荐语言。
发布于 2010-09-23 00:30:41
我想扩大我的编程知识。(...)我想我应该在这里提出这个问题,以及关于我正在寻找的语言类型的几个规定。有些是主观的,有些是为了简化从Haskell的过渡。
强类型系统。(...)这也使得对我的程序正确性的非正式推理变得更容易。我关心的是正确性,而不是效率。
强调递归而不是迭代。(...)
我担心你在这里可能会把过渡简化得有点过头了。非常严格的类型系统和纯函数风格是Haskell的特征,几乎任何类似于主流编程语言的东西都需要至少在其中之一上有所妥协。因此,考虑到这一点,这里有一些广泛的建议,旨在保留您似乎喜欢的关于Haskell的大部分内容,但有一些重大的变化。
->
读作逻辑蕴含!)。这些语言已经被用于数学证明和具有极高正确性要求的程序。Coq可能是这种风格中最突出的语言,但是Agda有一种Haskell-y的感觉(而且是用Haskell本身编写的)。这些建议中的大多数也在其他答案中提到,但希望我的基本原理能提供一些启示。
发布于 2010-09-23 01:23:14
我将成为那个家伙,并建议你要求的东西是错误的。
首先,你说你想开阔你的视野。然后你描述你想要的语言类型,它的视野听起来就像你已经拥有的视野。通过一遍又一遍地学习同样的东西,你不会有太多收获。
我建议你学习Lisp --即Common Lisp、Scheme/ Clojure或Clojure。默认情况下,它们都是动态类型的,但具有某种类型提示或可选的静态类型。球拍和Clojure可能是你最好的选择。
Clojure比较新,有更多的哈斯凯尔主义,比如默认情况下的不变性和大量的惰性计算,但它是基于Java虚拟机的,这意味着它有一些奇怪的缺点(例如,Java虚拟机不支持尾部调用消除,所以递归是一种黑客)。
Racket要老得多,但在此过程中获得了很多能力,例如静态类型支持和对函数式编程的关注。我想你可能会从球拍中得到最大的收获。
Lisps中的宏系统非常有趣,而且比您在其他任何地方看到的任何系统都要强大得多。这一点至少值得一看。
发布于 2010-09-22 23:26:36
从适合你的专业的角度来看,显而易见的选择似乎是一种逻辑语言,比如Prolog或它的派生语言。逻辑编程可以在函数式语言中非常灵活地完成(例如,参见The Reasoned Schemer),但您可能喜欢直接使用逻辑范例。
交互式定理证明系统也可能会引起您的兴趣。
https://stackoverflow.com/questions/3770774
复制相似问题