什么是Haskell实际上有用?

Ser*_*pia 465 haskell programming-languages functional-programming

例如,如果我开始学习Haskell,我可以发现自己使用它.我听说这种语言的一些常见用途是功能性的吗?

Xin*_*nus 303

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

快速应用开发.

如果你想知道"为什么是Haskell?",那么你需要考虑函数式编程语言的优点(取自http://c2.com/cgi/wiki?AdvantagesOfFunctionalProgramming):

  • 功能性课程往往比他们的ImperativeLanguage同行简洁得多.通常这会提高程序员的工作效率

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

  • FP在功能方面是模块化的,其中ObjectOrientedProgramming在不同组件的维度上是模块化的.

  • 有蛋糕吃的能力.想象一下,您有一个复杂的OO系统处理消息 - 每个组件可能会根据消息进行状态更改,然后将消息转发给它已链接到的某些对象.如果调用层次结构中的某个对象确定消息存在缺陷,那么能够轻松回滚每个更改都不是太酷吗?拥有不同国家的历史怎么样?

  • 为您做的许多内务处理任务:解构数据结构(PatternMatching),存储变量绑定(带闭包的LexicalScope),强类型(TypeInference),GarbageCollection,存储分配,是否使用盒装(指向值)或未装箱(直接值)代表......

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

除此之外,Haskell还有自己的优势,例如:

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

您可以查看以下链接:

  • 以下思想经常在我脑海中浮现:在纯语言中,函数在传递相同参数时总是返回相同的结果.这是一种保证.相反,命令式语言在"语句"之上构建了所​​有内容.声明没有任何形式的保证(除了执行消耗时间和产生热量).因此,基础已经摇摇欲坠,一切都在它之上仍然不稳定.对我而言,这是学习哈斯克尔的原因之一. (20认同)
  • @MartinDrautzburg当然声明带有保证.什么样的有用语言会有没有保证的陈述?例如,在C` x = 5;`保证在执行之后,`x`包含值`5`. (8认同)
  • 自问这个问题以来已经有6年了,而且自编程语言推出以来.尽管拥有较弱的类型系统并且通常"客观上较低"(根据功能/ ML粉丝),它在6年内设法运送了比Haskell在其26年中更多(和更重要)的软件.我的意思是这个案例研究; 很明显,有些东西正在使用功能语言,而且它们不能全部归结为炒作. (7认同)
  • @ E4z9是的但是在C++中它保证调用`operator =`.并且它保证如果你没有定义`operator =`会发生什么 (4认同)
  • 你忘记了一点 - 在haskell编码是一个绝对的爆炸;)我在haskell的一些问题上尝试了很多乐趣. (3认同)
  • _C++中的@immibis`x = 5`绝对不能保证`x`在执行(运算符重载)后包含值`5`.@lovasoa这两个语句都是正确的,因为可以在不评估列表中的第一项的情况下访问和评估列表中的第二项. (2认同)
  • @niceman 当然可以。但是,它不能保证在下一条语句执行之前您不会将 x 设置为其他内容。 (2认同)
  • @immibis这是一个很好的保证:) (2认同)
  • @immibis我其实并不是讽刺的意思.我实际上并不知道Haskell对Haskell的保证有多好的评论,这就是为什么我在这里 (2认同)

whe*_*ies 227

我认为这篇文章中的人对于从未使用过函数式编程语言的人来说是最重要的一点:扩展你的思想.如果您不熟悉函数式编程,那么Haskell会让您以前所未有的方式思考.因此,您在其他领域和其他语言的编程将得到改进.多少?难以量化.

  • 这个用不同语调写的答案说,Haskell对于程序员来说是一个很好的练习,IMO并不是一个很好的通用语言 (24认同)
  • 在Keera Studios,我们使用Haskell编写iOS和Android游戏和应用程序. (5认同)
  • 我正在使用iPhone,Mac。Haskell在哪里使用?我的意思是,对于我使用的应用程序,它们是用Objective-C或Swift +用于数据库和服务器的东西编写的。Swift也可以起作用。所以我再一次混淆了它的使用位置 (2认同)
  • Facebook使用它进行垃圾邮件检测:https://code.facebook.com/posts/745068642270222/fighting-spam-with-haskell/ (2认同)

Don*_*art 84

对于像Haskell这样的通用语言来说,有一个很好的答案:一般编写程序.

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

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

最后,我对它真正强大的看法是:

我希望这可以让你了解你的问题有多广泛,如果要以任何特异性回答.

  • 标签云被打破了 (15认同)

unu*_*tbu 29

Haskell实际应用的一个例子是xmonad,一个"少于1200行代码的特色窗口管理器".


Rob*_*ves 18

来自Haskell Wiki:

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

根据维基百科的说法,Haskell语言的出现是因为需要将现有的功能语言合并为一个可用于未来功能语言设计研究的通用功能语言.

很明显,根据可获得的信息,它已经超出了它的原始目的,并且不仅仅用于研究.它现在被认为是一种通用的函数式编程语言.

如果你还在问自己,"我为什么要使用它?",然后阅读为什么要使用它?Haskell Wiki介绍部分.


Ray*_*yne 13

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

是的,我是来自Dreamincode的Rayne.:)

我还想提一下,如果您还没有阅读维基百科页面,函数式编程就像面向对象编程这样的范例.以防你不知道.Haskell在它工作的意义上也是有用的; 它在那方面运作得很好.

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


Edg*_*rks 9

我有一个很酷的,Facebook创建了一个重写PHP代码的自动化工具.他们将源解析为抽象语法树,进行一些转换:

if ($f == false) -> if (false == $f)
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,但这似乎是他们特殊的风格,然后他们打印它.

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

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

实际上是各种各样的东西.它只是一种日常的通用语言,具有一些非常强大和有用的功能,如果你有点数学倾向.

  • Re:FB样式,在==之前放置false表示如果忘记并且只写一个=那么结果行为将更明显错误而不是静默执行意外的赋值操作并继续正常 (5认同)

And*_*are 6

来自Haskell:

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

基本上,Haskell可用于创建您通常使用其他通用语言创建的任何内容(例如C#,Java,C,C++等).


thS*_*oft 5

例如,用于开发交互式实时HTML5 Web应用程序.参见Elm,其编译器在Haskell中实现,其语法从Haskell中借鉴了很多.