首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Haskell之后要学习什么语言?

在Haskell之后要学习什么语言?
EN

Stack Overflow用户
提问于 2010-09-22 23:18:08
回答 17查看 14.8K关注 0票数 85

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

然而,在Haskell中编程就像巫术一样,我想扩展我的编程知识。我想选择一种新的编程语言来学习,但我没有足够的时间去选择一种任意的语言,放弃它,然后重复。因此,我想我应该在这里提出这个问题,以及关于我正在寻找的语言类型的几个规定。有些是主观的,有些是为了简化从Haskell的过渡。

  • 强类型系统。在Haskell编程中,我最喜欢的部分之一就是编写类型声明。这有助于构建我对单个函数以及它们与整个程序的关系的想法。这也使得对我的程序正确性的非正式推理变得更容易。我关心的是正确性,而不是递归上的efficiency.
  • Emphasis,而不是迭代。我在Haskell中使用迭代构造,但以递归方式实现它们。然而,与复杂的迭代过程相比,理解递归函数的结构要容易得多,特别是在使用组合符和高阶函数(如maps、folds和bind.
  • Rewarding )学习时。Haskell是一种值得使用的语言。这有点像读康德。然而,我几年前使用C的经验并非如此。我不是在寻找C语言。这门语言应该强制执行一种概念上有趣的范式,在我完全主观的观点中,C-likes并非如此。

权衡答案:当然,这些只是笔记。我只想回复每个给出格式良好的回复的人。你已经帮个我不少忙了。

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这样的证明助手是主要的推荐语言。

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2010-09-23 00:30:41

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

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

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

我担心你在这里可能会把过渡简化得有点过头了。非常严格的类型系统和纯函数风格是Haskell的特征,几乎任何类似于主流编程语言的东西都需要至少在其中之一上有所妥协。因此,考虑到这一点,这里有一些广泛的建议,旨在保留您似乎喜欢的关于Haskell的大部分内容,但有一些重大的变化。

  • Disregard的实用性和“更多的Haskell而不是Haskell":Haskell的类型系统充满了漏洞,由于不终止和其他混乱的妥协。清理乱七八糟的东西,添加更强大的功能,你就会得到像CoqAgda这样的语言,在这些语言中,函数的类型包含了其正确性的证明(你甚至可以将函数箭头->读作逻辑蕴含!)。这些语言已经被用于数学证明和具有极高正确性要求的程序。Coq可能是这种风格中最突出的语言,但是Agda有一种Haskell-y的感觉(而且是用Haskell本身编写的)。

  • Disregard类型,添加更多的魔法:如果Haskell是魔法,那么Lisp就是原始的、原始的创造魔法。Lisp系列语言(还包括方案Clojure)具有几乎无与伦比的灵活性,并结合了极简主义。这些语言本质上没有语法,直接以树数据结构的形式编写代码;在某些语言中,Lisp中的元编程比非元编程更容易。

  • Compromise稍微向主流靠拢: Haskell属于受ML影响很大的语言大家庭,您可以毫不费力地转向其中任何一种语言。当涉及到从类型和函数风格的使用来保证正确性时,Haskell是最严格的之一,而其他人通常要么是混合风格,要么是出于各种原因做出了务实的妥协。如果您想了解面向对象编程并访问许多主流技术平台,则JVM上的Scala或.NET上的F#与Haskell有许多共同之处,同时提供了与.NET和Java平台的轻松互操作性。微软直接支持F#,但与Haskell相比有一些恼人的限制,以及非Windows平台上的可移植性问题。Scala与Haskell的类型系统和Java的跨平台潜力有更多的直接对应,但具有更重量级的语法,并且缺乏F#所享有的强大的第一方支持。

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

票数 85
EN

Stack Overflow用户

发布于 2010-09-23 01:23:14

我将成为那个家伙,并建议你要求的东西是错误的。

首先,你说你想开阔你的视野。然后你描述你想要的语言类型,它的视野听起来就像你已经拥有的视野。通过一遍又一遍地学习同样的东西,你不会有太多收获。

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

Clojure比较新,有更多的哈斯凯尔主义,比如默认情况下的不变性和大量的惰性计算,但它是基于Java虚拟机的,这意味着它有一些奇怪的缺点(例如,Java虚拟机不支持尾部调用消除,所以递归是一种黑客)。

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

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

票数 20
EN

Stack Overflow用户

发布于 2010-09-22 23:26:36

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

交互式定理证明系统也可能会引起您的兴趣。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3770774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档