Answers:
Haskell与ML语言家族关系最为密切。这当然包括OCaml之类的东西,但也包括.NET平台上的F#。这些语言与Haskell共享类型系统的基础以及如何使用数据-代数数据类型,模式匹配,类型推断等。它们在其他方面与Haskell可能有很大不同,当然-大多数ML都是严格和不纯的首先,Haskell作为用于类型系统和语言设计的研究工具而流行,这意味着大多数ML风格的语言往往没有那么强大(但可能更易于理解)的类型系统。可以肯定地说,虽然您可能会想念有关Haskell的某些信息,尤其是起初,大多数Haskell程序员可能很快就会以基本的入门级水平在ML中感到宾至如归。如果您想要一种与Haskell 总体结构相同的语言,那么ML是您的最佳选择。
Scala的功能方面同样,它也极大地借鉴了ML的传统,还引入了Haskell熟悉的一些高级类型的系统功能,以及与之集成的更标准的OOP系统。虽然倾向于使用ML风格语言的OO作为“带有基本功能工具的模型OO”,但是Scala活着并呼吸着Java风格的OO。如您所想,这对Java互操作有好处,并且为OO程序员提供了更熟悉的工作环境。但是,由于具有Haskell的背景,您很可能会因Scala中的东西混合在一起而使功能性的成语变得笨拙,并且发现大多数Java API的设计不当且不必要地难以使用,这使您很烦恼。
最后,尽管看上去有些奇怪,但Clojure实际上在更哲学的层面上与Haskell有很多共同点。从Clojure的状态,价值与身份的方法中,您会发现大部分内容与 Haskell通过类型系统形式化的内容非常接近。相应地,Clojure在较小程度上强调Java互操作,而不必担心拖入OOP,因此在某些方面,Clojure进行函数式编程的方法可能与您已经熟悉的最接近。据我所知,就我所知,Clojure是Haskell之外唯一具有STM实现的语言简单,有效且有效。另一方面,Clojure来自Lisp传统,因此缺少静态类型系统,而只强调在ML影响的语言中发现的代数数据类型和模式匹配。当然,这是一个Lisp,它本身对某些人是不利的(尽管我真的不知道为什么)。
对于我自己来说,免责声明我对函数式编程的第一次经验是在Scheme中,我可能倾向于Clojure,而OCaml可能是第二选择。
我自己从未使用过它,但是我有时会在博客或项目描述中看到Scala的出现,并且我相信它采用了Haskell的主要概念。Scala可以编译为JVM,并且可以与Java互操作。
Clojure越来越广泛地被使用,尽管它在表面上看起来并不像Haskell,但是如果您看起来更深一点,它显然是非常受Haskell启发的,并且鼓励使用非常相似的功能样式。
Haskell用户可能会发现的熟悉和吸引人的关键Clojure功能:
主要差异(根据您的观点可能是正面的也可能是负面的):
个人观点:我在Clojure之前学过Haskell,并且因为Haskell的优雅和数学上的纯正而喜欢它。Clojure吸引了很多灵感,并借鉴了Haskell的许多出色功能,但这是一种更加务实/实用的语言。尤其是当您想到能够利用Java库生态系统的巨大价值时,它是“完成工作”的绝佳语言。