Haskell在现实世界中有什么用?[关闭]


475

Haskell周围有很多炒作,但是,很难获得有关在实际应用中如何使用它的信息。Haskell最受欢迎的项目/用法是什么?为什么它擅长解决这些问题?


56
不,我不会,因为这是一个明确的答案。没有意见和这样的回旋余地。我只想知道该语言是为什么创建的。
瑟吉奥·塔皮亚


12
@ Papuccino1,等等,您是否想知道它的作用创建目的?前者是这个问题在问什么,那里还有很多意见余地……
bdonlan

3
@ Papuccino1-标题中的多余单词对问题有什么好处?另外,我认为您在这种情况下误解了“功能”一词的使用,但这很难说出来。
克里斯·卢茨

2
根据他们自己的网站,许多公司将其用于不同目的... haskell.org/haskellwiki/Haskell_in_industry
朱利安

Answers:


309

这种语言有哪些常见用途?

快速的应用程序开发。

如果您想知道“为什么要使用Haskell?”,那么您需要考虑函数式编程语言的优势(取自https://c2.com/cgi/wiki?AdvantagesOfFunctionalProgramming):

  • 功能程序往往比其ImperativeLanguage程序简洁得多。通常,这可以提高程序员的生产力

  • FP鼓励快速制作原型。因此,我认为这是ExtremeProgrammers的最佳软件设计范例...但是我知道什么?

  • FP在功能方面是模块化的,而ObjectOrientedProgramming在不同组件方面是模块化的。

  • 拥有吃蛋糕的能力。假设您有一个复杂的面向对象的系统处理消息-每个组件都可能根据消息进行状态更改,然后将消息转发到它具有链接的某些对象。如果调用层次结构深处的某个对象确定消息有缺陷,那么能够轻松地回滚每个更改是否太酷了?有不同状态的历史怎么样?

  • 为您完成许多整理工作:解构数据结构(PatternMatching),存储变量绑定(带闭包的LexicalScope),强类型(TypeInference),GarbageCollection,存储分配,是否使用盒装(指向值的指针)或未盒装(直接值) )表示...

  • 安全的多线程!不变的数据结构不受数据争用条件的影响,因此不必受锁保护。如果您总是分配新对象,而不是破坏性地操作现有对象,则可以在分配和GarbageCollection系统中隐藏锁定。

除此以外,Haskell还具有以下优点:

  • 受数学符号启发的清晰,直观的语法。
  • 列表理解可基于现有列表创建列表。
  • Lambda表达式:创建函数时不给它们明确的名称。因此,处理大型公式更加容易。
  • Haskell是完全参照透明的。任何使用I / O的代码都必须这样标记。这样,它鼓励您将带有副作用(例如,在屏幕上放置文本)的代码与没有(计算)代码的代码分开。
  • 惰性评估是一个非常好的功能:
    • 即使通常会导致错误的东西,只要您不使用结果,它仍然可以工作。例如,您可以将其1 / 0作为列表的第一项,如果仅使用第二项,它将仍然有效。
    • 编写诸如sudoku求解器之类的搜索程序会更容易,因为它不会一次加载每个组合-它会随即生成它们。您可以使用其他语言来执行此操作,但是默认情况下只有Haskell可以执行此操作。

您可以查看以下链接:


20
通常我会想到以下想法:在纯语言中,函数在传递相同的参数时总是返回相同的结果。这是保证。相反,命令式语言将所有内容构建在“语句”之上。语句没有任何形式的保证(执行语句会浪费时间并产生热量)。因此,基础已经摇摇欲坠,并且基础之上的所有物件都会摇摇欲坠。对我来说,这是学习haskell的原因之一。
马丁·德劳茨堡

8
自从问这个问题以及Go编程语言问世以来已经6年了。尽管类型系统较弱并且通常在客观上逊色(根据功能/ ML爱好者),但在这6年中,它比Haskell在26年中交付了更多(更重要)的软件。我的意思是作为案例研究;显然,有些东西阻碍了功能语言的发展,并且不能全部归功于炒作。
weberc2

3
您忘记了一点-在haskell中进行编码是绝对的爆炸;)尝试在haskell中的一些问题上,我玩得很开心。
J Atkin

8
@MartinDrautzburg当然,声明带有保证。哪种有用的语言会有没有保证的陈述?例如,在C中x = 5;保证执行后x包含值5
user253751 '16

5
@ E4z9是的,但是在C ++中它保证operator =被调用。如果没有定义operator =
user253751

234

我认为,对于从未使用过函数式编程语言的任何人,这篇文章中的人们都没有抓住最重要的要点:扩展您的思维。如果您不熟悉函数式编程,那么Haskell将使您以前所未有的方式思考。结果,您在其他领域和其他语言中的编程将得到改善。多少?难以量化。


2
我正在使用iPhone,Mac。Haskell在哪里使用?我的意思是,对于我使用的应用程序,它们是用Objective-C或Swift +为数据库和服务器编写的。Swift也可以起作用。再次让我对它的使用位置感到困惑
Honey

2
Facebook并垃圾邮件检测它:code.facebook.com/posts/745068642270222/...
亚历克斯

25
用不同的语气写的这个答案说,Haskell对程序员来说是一个很好的练习,而IMO并不是一个很好的通用语言
Passer By

5
在Keera Studios,我们使用Haskell编写iOS和Android游戏以及应用程序。
伊万·佩雷斯

1
我完全同意这种说法。数十年来,我已经用命令式语言编写了许多代码。我一直在探索Haskell几个月,这让我对以前从未想过的事情打开了胸怀。
Adahus

87

对于像Haskell这样的通用语言有什么好处,有一个很好的答案:编写程序。

对于它在实践中的用途,我采用三种方法来确定:

表示它适用于图形,网络,系统编程,数据结构,数据库,开发,文本处理...

  • 它用于工业领域 -许多DSL,Web应用程序,编译器设计,网络,分析,系统编程,...

最后,我对它的真正优势有以下看法:

我希望这能使您对您的问题有一个广泛的了解,如果它能以任何具体的方式回答。


15
标签云被打破
Elliot Cameron

标签云是使用wordcloud生成的吗?
Janus Troelsen

29

运行Haskell的一个例子是xmonad,它是“少于1200行代码的功能强大的窗口管理器”。


18

Haskell Wiki

从航空航天和国防到金融,再到网络初创公司,硬件设计公司和割草机制造商,Haskell在商业上的用途广泛。该页面收集有关Haskell的工业用途的资源。

根据Wikipedia的说法,创建Haskell语言是出于将现有功能语言整合为一种通用语言的目的,该语言可用于将来在功能语言设计中进行研究。

基于现有信息,很明显它已经超出了其最初的目的,并且用于研究的目的还不止于此。现在,它被认为是一种通用的功能编程语言。

如果您仍然在问自己“我为什么要使用它?”,请阅读为什么使用它?Haskell Wiki简介的“参考”部分。


13

Haskell是一种通用编程语言。它可以用于使用任何其他语言来做的任何事情。除了您自己的想像力之外,您不受任何限制。至于它适合什么呢?好吧,几乎所有东西。很少有功能语言不能胜任的任务。

是的,我是Dreamincode的Rayne。:)

我还要提及的是,如果您还没有阅读Wikipedia页面,那么函数式编程就是一种范例,就像面向对象的编程就是一种范例。以防万一你不知道。从有效的角度来说,Haskell也可以发挥作用。在那方面效果很好。

仅仅因为一种语言不是面向对象的语言并不意味着该语言受到任何限制。Haskell是一种通用编程语言,与Java一样通用。


9

我有一个很棒的网站,facebook创建了一个用于重写PHP代码的自动化工具。他们将源解析为抽象语法树,进行一些转换:

if ($f == false) -> if (false == $f)

我不知道为什么,但这似乎是他们的特殊风格,然后他们很漂亮地打印出来。

https://github.com/facebook/lex-pass

我们使用haskell来制作小型领域特定的语言。大量的数据处理。Web开发。网络蜘蛛。测试应用程序。编写系统管理脚本。后端脚本,可与其他方通信。监视脚本(我们有一个与munin一起很好地工作的DSL,可以更轻松地为您的应用程序编写正确的监视代码。)

实际上是各种各样的东西。如果您在数学上有些偏爱,它只是一种日常通用语言,具有一些非常强大和有用的功能。


6
回复:FB风格,在==之前加上false意味着如果您忘记了并且只写了一个=,那么结果的行为将更加明显是错误的,而不是默默地执行意外的赋值操作并继续正常进行
Magnus,2014年

一个很聪明的方法,那就迫使您知道那个特别的错误。
Edgar Klerks 2014年

@ EdgarKlerks,PHP没有编译时间。这迫使在错误所在的地方引发异常,而不是导致异常行为或遥远代码中的错误。
dfeuer

尽管我看到了false在左侧写代码的好处,但我看不到使用工具自动执行此操作的意义:如果您已经有一个==操作员,那么您已经知道您没有那部分错误lex-pass的目的是赶上,如果您没有lex-pass,则=无法肯定地说出是否是这样。
Jeremy List

1
@JeremyList也许他们对编码风格确实很严格。我可以看到格式整齐的代码邀请您编写更整齐的代码。只是一个疯狂的猜测。
Edgar Klerks 2015年

6

Haskell

Haskell是一种标准化的通用纯函数式编程语言,具有非严格的语义和强大的静态类型。它以逻辑学家Haskell Curry的名字命名。

基本上,Haskell可用于创建通常使用其他通用语言(例如C#,Java,C,C ++等)创建的几乎所有内容。


5

例如,用于开发交互式实时HTML5 Web应用程序。请参阅Elm,其编译器是在Haskell中实现的,其语法是从Haskell的库中借来的。


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.