使用LISP和Haskell有什么优势?他们会让我成为更好的程序员吗?[关闭]


41

我知道Lisp和Haskell分别是逻辑和函数编程语言,但这到底意味着什么?它们与其他语言有何不同?我听说学习这些将使您成为一个更好的程序员并改善您的逻辑。这是真的,如果我学习Lisp或Haskell达到了能干的水平,我的编程会得到改善,并且我会更好地处理任何语言的问题吗?我只是想知道看看它们是否值得学习。这些语言在GUI和图形等领域是否有用,还是仅对控制台应用程序有用?


36
我保证,使用LISP和Haskell将使您成为更好的LISP和Haskell程序员。
Neil

17
@MasonWheeler我不得不说;Haskell的类型系统中有很多其他语言都找不到的,而且LISP宏在任何主流语言中都找不到。这两件事都是值得学习的,因为它们确实使您成为使用工作语言的更好的程序员。至少这是我的经验;Haskell使我成为更好的企业C#开发人员。我知道干净地实现关注点分离的技术,这是我以前从未有过的,而且对我而言,解析问题将永远比我学Haskell之前要简单得多。
Jimmy Hoffa 2013年

6
Erlang是一种功能语言。Rabbit MQ是用Erlang编写的,Rabbit在很多地方都使用它来执行许多关键任务的繁重工作。函数式语言教您对编程进行不同的思考,这是您可以使用的一个不错的额外工具。尽管确实有一些概念使它成为了更流行的语言(例如,C#和C ++中的lambda表达式),但是在使用功能语言时,您仍然以非常不同的方式解决问题。
Binary Worrier 2013年

8
@MasonWheeler有充分的理由说明一种语言可能比其他语言更有用,但仍未被广泛使用。我可以想到很多:现有的用户群,当“好就足够好”时,变化太大了,还有……当更好的工具需要经过正式培训的程序员时。因此,普及并不是衡量有用性的好方法。
Andres F.

5
@MasonWheeler使用类推,数学是现实生活中非常有用的领域。那么,为什么没有更多的人精通数学呢?为什么很多人对此感到恐惧,并且认为它是黑魔法,而不是真正有用的呢?
Andres F.

Answers:


37

就像学习数学会提高您的分析能力,学习拉丁文/经典文学会提高您的写作技巧一样。

设计这些语言的人认真思考了编写程序的含义。这些语言是这些研究的结果。

也就是说,学习Java也将使您成为更好的程序员。学习C。真正的好处来自学习不同哲学的语言。然后,您可以对程序编写方式有自己的看法。

编辑

我意识到这个答案对尚未学习过Haskell和/或Lisp的人没有太大帮助。这里有一些例子可以进一步解释我的意思

LISP

Lisp认为语法应该最小化,并且所有内容都应该是列表或原语(Lisp代表列表处理)。甚至程序也主要是包含其他列表和符号的列表。Lisp允许您将程序作为列表进行操作,并即时生成新程序。因此,整个code is data and data is code座右铭。

直接的结果是Lisp语言允许您定义所需的任何接口。compojure是一个很好的例子,它是一个clojure Web框架。这是路由功能的样子

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

另一个很好的例子是打ic模板框架:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

如您所见,结果像胡子一样像DSL一样简洁,但是允许您使用诸如的语言功能(for [x (range 1 4)] block)。更好的是,您拥有所有用于抽象和构造代码的工具。

在其他语言中,语法更复杂。您不能将Java程序看作一堆列表。但是,通过使用Lisp,您可以更好地了解理想接口的外观,以及代码中的哪些内容可以抽象为数据。它还可以帮助您将喜欢的语言视为一种大数据结构,并更好地理解其语义。

哈斯克尔

Haskell相信强大的静态类型和纯度。纯函数类似于数学函数:它们在一组值上定义,然后将它们映射到另一组上。函数没有副作用,并且值是不变的。纯度很有趣,因为它不是多范式语言所能拥有的。语言是纯语言还是非纯语言。

结果是,您无法随时执行IO操作(报名者认为这是一件好事)。IO操作被定义为事务,它们本身就是纯值。mainhaskell程序的值是运行该程序时执行的IO事务。

您必须明确处理程序中的数据流。您不能通过写入和读取全局变量中的内容来使两个组件进行通信。您必须建立并传递值。

Jimmy Hoffa提到的另一个功能是丰富类型系统。虽然其他语言具有静态类型,但是在haskell中,您可以进行如下操作:

length :: [a] -> Int (从a的列表到int的函数)

map :: (a -> b) -> [a] -> [b](该函数接受a to b转换和a的列表,然后返回b的列表)

令人高兴的是,我不需要解释这些功能的实际作用:您已经了解了它们的行为。而且,具有这些签名的函数除了计算列表的长度并将映射映射到列表之外,实际上什么也做不到。

在其他类型的语言中,类层次结构与可变性相结合,使得处理这些类型成为噩梦。您必须了解协方差和逆方差之类的东西,从语言的角度来看,这是不可能正确的(即简单,强大和安全)。

您要么选择安全的路径(例如scala)并最终使用了非常复杂的语言,要么您选择了简单的路径并获得了受限的(google go泛型仅限于列表和地图)或不安全的内容(dart泛型始终协变)。

通过使用haskell,您主要了解纯净的好处以及如何编写纯净的代码。


1
@JimmyHoffa我认为这实际上应该得到自己的答案,因为这是人们容易忽略的地方。通过功能性编程可以最好地解决某些问题域,而人们至少在涉足舒适区以外的那些域之前,他们甚至还没有意识到它们的存在。
KChaloux

2
我不知道Assembly,也没有提及。但是,汇编程序可以帮助您了解程序的运行方式。SO上有一篇很棒的文章,他们能够分析一个生成的程序集以解释性能问题。
西蒙·贝格

3
@KChaloux我会写答案,但是这个问题应该关闭(我对此进行了投票)。简而言之,我可以将我的观点和经验写在一个答案中,但这不会比其他答案正确或错误。
Jimmy Hoffa

7
OMG,@ Neil知道计算机实际能做的最确定的事情将使您成为一个更好的程序员。我已经好几年没有写汇编了,但是(在许多平台上)经常阅读它,如果您关心程序的实际运行方式,那么至少要了解基础知识至关重要。
dash-tom-bang

3
@Neil,在什么情况下成为更糟糕的程序员有好处?是什么让您提出意大利面条代码?除了在幻想中不了解汇编程序并需要合理化以避免学习汇编程序的幻想世界之外,意大利面条代码与汇编程序或成为优秀的程序员有什么关系?如果有的话,成为一名优秀的汇编编码员会使人们高度意识到不良的编码实践。
dash-tom-bang

12

tl; dr学习新知识只会使您成为更好的程序员,而成为更好的程序员与您可以编写代码所用的语言无关。

使用LISP和Haskell有什么优势?

LISP:

  1. 同音代码。这允许结构化的自我修改代码。
  2. 语法可识别的宏。它们允许重写样板代码。
  3. 实用主义。CL旨在使工作的专业人员完成工作。通常,大多数功能语言都不是。
  4. 灵活性。它可以以合理的速度完成许多不同的事情。
  5. 警惕。现实世界是混乱的。语用编码最终不得不使用或发明混乱的构造。Common Lisp具有足够的警惕性,可以完成工作。

可以说,选择CL的唯一真正原因是标准库已过时。

我会大胆地说,在一般情况下,语法对于专业软件工作者来说应该不成问题。

来自:为什么Lisp有用?

Haskell:

Haskell是一种计算机编程语言。特别是,它是一种多态静态类型的,惰性的,纯函数式语言,与大多数其他编程语言完全不同。该语言以Haskell Brooks Curry命名,他在数学逻辑方面的工作为功能语言奠定了基础。Haskell基于lambda演算,因此我们将lambda用作徽标。

您可以在此处阅读功能说明与命令说明

来自:http : //www.haskell.org/haskellwiki/简介

他们会让我成为更好的程序员吗?

是的,当然,了解更多的语言和范例只会使您成为一个更好的程序员,但是要直截了当:

没有一个工具,一本书,一个编程范例可以使您成为更好的程序员。

学习具有不同范例的不同编程语言绝对可以帮助您成为一名更好的程序员,学习解决具有不同方法的问题也将极大地有益于您的逻辑思维。

成为一个优秀的程序员并不关乎语言,而是关乎具有用任何一种语言解决任何问题的能力。而且,当您不懂该语言时,可以快速学习该语言并有效地使用它。

我认为您的想法越全球化,您就越是优秀的开发人员。

例如,您可以在代码中添加有用的注释,关心代码的可读性和可维护性。注意小细节。输入之前请三思!了解设计模式。遵循良好做法。

披露:这是最糟糕的无耻广告,因为它来自我的博客。


4
您是否已学过LISP或Haskell的任何相关知识?
Jimmy Hoffa 2013年

10
听到几乎一无所知的人的声音有点不屑一顾。您声称它们不是您现在所需的工具,但是您不知道它们是用于什么的工具,那么您怎么知道呢?另外,如果您知道LISP是仅在关系数据分析中有用的SQL派生类,而Haskell可能是Regexp的严格子集,那么您如何建议某人从他们那里学到什么,或从他们那里学到什么。
Jimmy Hoffa 2013年

10
这并不能真正回答问题。您成功地完成了一个令人印象深刻的壮举,即对一个您不知道的两种语言的问题给出一个模糊的一般性答案:/
Andres F.

2
-1,因为这模糊地围绕 Common Lisp和Haskell教给您的内容。示例:作为数据的数据作为代码的数据,纯度,参照透明性,单子抽象,功能编程,面向语言的编程,类型导向的编程等,等等
jozefg

3
此外,我不知道两种语言,我认为您无法回答这个问题:/对不起
jozefg 2013年

9

当您学习通常所使用的范式之外的语言时,它将使您每天都可以选择其他解决方案,甚至可以帮助您更好地理解所选语言的某些功能。除非您能吸取从这些语言中学到的经验并将其应用于每天遇到的情况,否则了解这些语言不会使您成为一个更好的程序员。

话虽如此,它不仅限于语言。当您阅读以前从未见过或使用过的各种数据结构时,它可以帮助您拓宽知识的范围,因此下次遇到问题时,您将有另一个解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.