J C*_*per 104 lisp comparison haskell language-comparisons
对于那些在Haskell和一些Lisp中都有经验的人,我很好奇是如何"愉快"(使用一个可怕的术语)是在Haskell和Lisp中编写代码.
一些背景:我学习Haskell现在,稍早有计划和CL(和一点点进军Clojure的)工作.传统上,你可以认为我是动态语言的粉丝,因为它们提供了简洁和快速.我很快就爱上了Lisp宏,因为它给了我另一种避免冗长和样板的方法.
我发现哈斯克尔难以置信的有趣,因为它把我介绍给编码我不知道的方式.它肯定有一些方面似乎有助于实现敏捷性,比如易于编写部分功能.不过,我有点担心失去Lisp的宏(我假设我失去他们,说实话我可能只是没有了解他们吗?)和静态类型系统.
会有人谁做了两个世界编码,像样的数目介意评论经验如何不同,您喜欢哪一种,如果说偏好的态势?
Shr*_*saR 68
简短回答:
[注意:有一个" 模板Haskell "可以让你像在Lisp中一样编写宏,但严格来说你永远不需要它.
Mat*_*ard 64
首先,不要担心失去动态类型等特定功能.由于您熟悉Common Lisp,这是一种设计精良的语言,我假设您已经意识到语言不能简化为其功能集.这一切都是关于一个连贯的整体,不是吗?
在这方面,Haskell的亮度与Common Lisp一样明亮.它的功能相结合,为您提供了一种编程方式,使代码非常简短和优雅.通过更复杂(但同样,更难以理解和使用)的概念,如monad和箭头,可以减轻宏的缺乏.静态类型系统增加了你的能力,而不是像大多数面向对象语言那样妨碍你.
另一方面,Haskell中的编程比Lisp更不具有交互性,而像Lisp这样的语言中存在的大量反射不适合Haskell预设的世界静态视图.因此,您可以使用的工具集在两种语言之间存在很大差异,但很难相互比较.
我个人更喜欢Lisp的编程方式,因为我认为它符合我工作的方式.但是,这并不意味着你也必然会这样做.
Her*_*ann 13
在Haskell中对元编程的需求比在Common Lisp中少,因为很多可以围绕monad构建,增加的语法使得嵌入式DSL看起来不像树一样,但是ShreevatsaR,甚至Liskell(Haskell语义+ Lisp)都提到了模板Haskell.语法)如果你喜欢括号.
Hib*_*u57 10
关于宏,这里有一个讨论它的页面:Hello Haskell,Goodbye Lisp.它解释了Haskell中不需要宏的观点.它附有一个简短的比较例子.
需要LISP宏以避免评估两个参数的示例情况:
(defmacro doif (x y) `(if ,x ,y))
Run Code Online (Sandbox Code Playgroud)
示例情况,其中Haskell没有系统地计算两个参数,而不需要像宏定义那样:
doif x y = if x then (Just y) else Nothing
Run Code Online (Sandbox Code Playgroud)
瞧
我是Common Lisp程序员.
在不久前尝试过Haskell之后,我个人的底线就是坚持使用CL.
原因:
Haskell确实有自己的优点,并且以一种根本不同的方式做一些事情,但它并没有为我长期削减它.
小智 5
在Lisp中,使用Haskell繁琐(如果可能)的宏可以实现非常酷的事情。以“ memoize”宏为例(请参阅Peter Norvig的PAIP的第9章)。有了它,您可以定义一个函数,例如foo,然后简单地求值(记住'foo),该函数用一个已记忆的版本替换foo的全局定义。在Haskell中使用高阶函数可以达到相同的效果吗?