Haskell真的是天才和学术界的语言吗?



我曾经与一家以色列初创公司的创始人进行过讨论,该公司开发基于GPU的数据库,并专注于速度。 工作堆栈包括Haskell和C ++等,并且创始人抱怨要找到能干的程序员有多困难。 这就是他来莫斯科的原因之一。

我仔细询问了他们是否考虑使用更流行和新的东西。 即使答案很礼貌并且得到论点的充分支持,它听起来仍然像是“来吧,甚至不要提这些玩具”。

在此之前,我所听说的有关Haskell的所有信息都可以概括为“在处理时要非常小心”。 为了更好地了解Haskell程序员,我来到了带有一些问题的主题电报聊天。 一开始我很害怕,事实证明我是对的。

Haskell不会提供流行的解释,人们似乎甚至不尝试。 如果曾经提过这个话题,那么它只会被尽可能深入和客观地讨论。 有人给我写信:“ Haskell本身及其社区的定义性特征之一是,他们没有试图获得任何形式的主流认可。 相反,他们专注于构建一种逻辑上的,解决实际问题的主要方式,而不是试图使尽可能多的受众满意”

不过,有几个人确实告诉了我他们的经历,如下所示。

Denis Mirzoev( nolane :当我上大学时,他们为我提供了在Haskell上Coursera的课程,以获得额外的荣誉。 然后我们还开设了一个函数编程课程,其中包括Haskell。 我已经写了一篇关于GHC的学期论文和毕业论文。 然后我找到了一名Haskell程序员的工作。

过去,现在仍然很艰难。 当您开始学习Haskell时,必须将很多新概念塞入脑海。 就像重新学习从头开始编写代码一样。

人们往往会忘记(或抚平)以前的记忆:就像他们在努力理解“指针”,“功能”或“阶级”是什么时一样。 也许这就是为什么他们很难学习Haskell的原因:随着年龄的增长,学习新知识变得越来越困难。

Doctor_Ryner :一旦我因Redux混蛋而在工作中无法通过试用,因此我尝试通过观看其创作者的视频来使自己更加自在。 首先,我使用JavaScript进行练习,但是后来,我了解了Haskell,它被认为是“真正的”功能语言。 它的独特概念以及它的简洁让我着迷。

但是,教程并不是太用户友好,加上其必不可少的背景技术可以防止出现新概念。

Yuri Syrovetskiy( cblp :最难的是要学习Haskell作为第二语言,当学习第一语言的记忆仍然很新鲜时,

Haskell的好与坏是什么?


Doctor_Ryner :简洁,优雅且灵活。 难怪EDSL上有一半的库(或者至少感觉像这样)。

Yuri Syrovetskiy :(主观地)很容易将您的思想适应代码,它在命令性和功能性范例之间取得了很好的平衡。 建立数据和算法的抽象非常简单,它可以考虑手头的任务,而不会因烦恼而分心。

约翰·杜John Doe) :严格,典型的代表(甚至是法西斯主义者)。

Igor Shevnin( interphx :一个很棒的类型系统。 它不像Idris或Agda那样强大,但是仍然可以到达方便的中间点,在这里您几乎可以描述任何内容,但是类型推断仍然可以正常工作。 您不必每次都手动标记它们。

但是强大的类型系统会迫使您更加注意所传递的值。 一堆类型定义可能看起来像样板。 每个命令都有自己的扩展集,或者根本没有扩展集。 代码是“ denser”-每个字符串通常比其他语言携带更多的信息,因此对于没有经验的开发人员来说更难阅读。

Doctor_Ryner :在学习Haskell时,您可能会偶然发现这句话:“如果编译,那可能是正确的”。 Null不存在,功能范式本身非常严格,可以使您始终遵守某些准则,这在大多数情况下可带来更好的设计。

例如,Haskell没有变量-只有常量。 您不必跟踪在哪里分配了什么。 Haskell鼓励使用“纯”功能,这些功能没有副作用。 与面向对象的语言相反,功能设计迫使程序作为一个整体来工作,而在面向对象的语言中,许多对象试图利用这些副作用相互通信,从而使应用程序变得无法预测。 在工作中,我们在C#和Unity中遭受了很多苦难。

丹尼斯·米尔佐夫(Denis Mirzoev) :当语言自然地“懒惰”时,它通常更具表现力。 算法变得更简单。 如果不使用中间结果,它将大大提高性能。

伊戈尔·谢夫宁(Igor Shevnin) :“懒惰”通常会有所帮助,但是当函数调用的顺序很重要时,有时很难理解发生了什么。

Doctor_Ryner :如果符合要求,可能很快。

Denis Mirzoev :在性能方面,它可以与Java媲美,但不及C。

Igor Shevnin :开箱即用的扩展支持,使您可以根据自己的喜好来定制语言和类型系统。 有许多扩展已被社区广泛使用,并且具有不错的示例和文档。

Doctor_Ryner :标准的Prelude库具有很多错误的函数,例如read,head,readFile,它们可能引发异常并崩溃应用程序,而不是返回Maybe。 因此,我必须使用替代方法或编写自己的替代方法。

伊戈尔·谢夫宁(Igor Shevnin) :最大的问题是缺乏标准,以至于很多人用其中一种互不兼容的替代品代替标准库。 社区对标准库应该是什么,必须在核心发行版中包括什么以及可以卸载到扩展中的东西的分歧……在我看来,这扼杀了语言的发展。

Denis Mirzoev :它缺少工具:没有合适的IDE,很少的性能基准,没有“逐步的”调试-这是一个基本问题。

Haskell最适合哪些项目?


YS :对于复杂,安全和财务相关的任务,错误代价很高。

Doctor_Ryner :适用于您需要计算,转换和分析的所有内容。 令我惊讶的是,Haskell在数据科学应用程序中不如Python流行。

IS :我不会冒险将其用于嵌入式系统(速度很快,但是由于“懒惰”计算而导致内存开销仍然很大)或小型脚本(不需要严格的特性)。 了解与主流语言相比,找到开发人员有多么困难也很重要。

约翰·杜(John Doe) :要编写将被他人阅读的工业代码,但随后您需要整个Haskell开发人员团队。 没有很多。

IS :但是,由于它简洁而严格的性质,您几乎可以将Haskell用于任何事物。

从Haskell开始您的开发职业是一个好主意吗?


IS :可能不是,因为没有编写开发人员必须使用的绝大多数代码库。

John Doe :好主意! 非ML语言-工业应用中几乎所有的语言-都会令您震惊。

DS :通常人们首先学习数学,然后再转向编程。 因此,从理论上讲,学习一种需要大量数学概念(代数数据类型,纯函数)的语言比命令式语言要容易。 我认为这是个好主意。

Doctor_Ryner :与我一起工作的所有新手开发人员首先介绍Haskell。 不需要命令式风格的人可以更快地学习功能代码,即使以后再使用面向对象的语言,他们也倾向于使用良好的体系结构解决方案,因为它们已经习惯了。

YS :最好以两种基本不同的语言开始,例如C,Haskell和Smalltalk,以任何顺序。 没有一种语言可以让您完全了解景观。

Haskell是一门古老的语言。 是好是坏?


YS :该语言非常活跃地开发,因此它不会拖累向后兼容性。

John Doe :它是1998年标准化的,但是您不会注意到:直到今天,大约每6个月就有一个新的编译器版本,有可能破坏向后兼容性。

DS :Haskell并不老,它只是经过反复测试的。 它不会(也永远不会)引入无意识的变化。 因此,这可能对社区的健康有益。

人们常说Haskell是最难学的语言之一。 真的吗


Doctor_Ryner :作为一种语言本身-不。 最难的部分是它使用的抽象。 一个从未见过Haskell代码的人可能会因大量新信息和奇怪指令而发疯。 无济于事的是,该语言“限制”了许多不适合其功能概念的内容。

John Doe :我花了两个月的上床时间教科书,手册和教程,才开始编译我的第一个项目。 想法一经最终编译,就可以在满负载(平均6k RPS,峰值15k)下工作半年,并且没有任何变化。

DS :我敢打赌,如果您将一名大学生Haskell作为第一语言,而他却走得更远,那么命令式编程对他来说看起来会很复杂且不太直观。

IS :都是相对的。 在主流语言中,我认为C ++最困难。 从概念上讲,证明定理的语言(例如Agda或Coq)比Haskell难。 Haskell并不是一种硬语言,但是需要花一些时间来学习其模式和库(包括标准库和第三方库)。

它的复杂性合理吗?


IS :模式和较高的抽象级别是合理的,因为它使代码更短,更持久。 但是我认为运算符,函数名和许多其他事情可能对用户更友好。

Doctor_Ryner :通常,Haskell的复杂性使您可以制作非常简短,灵活且模块化的解决方案。

YS :我想说,只有效果控制有点不可思议,尽管它几乎总是比没有控制更好。 并且有一个正在进行的项目使其变得更简单。

John Doe :对于习惯使用Python / PHP /等等的人,Haskell感到脱离了现实。 对于那些您尚未对类别理论感兴趣的人,很难从头开始学习。 但是,一旦您了解了它,就会发现解决问题的新方法。

人们常说Haskell不是针对开发人员的语言,而是针对数学家的语言。 这是不是主流的原因吗?


DS :它展示了Haskell主要开发人员的主要思想-“不惜一切代价避免成功”。 不是意味着“避免成功”,而是“避免过于昂贵的成功”。

他们本可以使Haskell受欢迎。 例如,Microsoft支持该语言。 他们本来可以使它变得更重要,但为了普及而牺牲了刚性。 他们可以使用很多肮脏的技巧,但是从来没有。

当然,该语言并不流行,但这意味着它的质量不会受到影响。 与命令式语言相比,Haskell的优势对我来说很明显,并且它的所有问题都可以解决,因此我相信它会在以后流行。

YS :只有对此一无所知的人会这样说。 Haskell在“现实世界”开发中经常使用,您可能会在自己喜欢的搜索引擎中找到示例。 特别是,我们卡巴斯基实验室(Kaspersky Labs)对Haskell非常满意,并且不会将其用于其他任何交易。

IS :什么是“数学家的语言”? 它要么是专门为统计和计算而构建的R / MatLab / Mathematica,要么是Python,因为它更简单并且不需要太多的工程背景。 但不是Haskell。 它具有像代数一样的代数元素,但具有实际应用价值。

C / C ++ / Java之所以如此受欢迎,是因为它们在企业空间中历来非常广泛。 他们填补了一个利基。 但是如今,许多公司开始使用Haskell和其他功能语言。

您将Haskell与哪个PL进行比较?


约翰·多伊(John Doe) :可能是与埃尔朗一起流行的。 但是,Erlang更易于学习和编写。

DS :我知道C,C ++,Java和Haskell。 C ++太糟糕了,无法与任何东西进行比较。 C非常适合底层开发。 在所有其他应用程序中,我更喜欢Haskell。

在Java和Haskell之间进行选择比较困难,但这取决于应用程序。 例如,Java对于Android更好,但是在服务器应用程序中,它们几乎相等。 如果环境-工具,库-允许,我经常选择Haskell。

Doctor_Ryner :我与C#进行比较。 只是谷歌“如何在C#和Haskell中做也许”。 奇怪的是,像Haskell这样严格的功能性语言感觉更加灵活和自由。 但实际上,它们是相反的两极。

C#是最面向对象的语言之一,它的优势与Haskell相反。 C#总是迫使您编写很多额外的东西,这减慢了代码的速度,并常常使它变得不太优雅。 在Haskell提供简短而整洁的解决方案之后,很难回头。

IS :有了Rust,到目前为止,Rust可能会获胜。 它需要Haskell和其他功能语言的大量支持,但是将功能性方法和命令性方法混为一谈,而且开发人员更加智能地处理了其开发。

您对Haskell社区有何看法?


约翰·多伊(John Doe) :绝大多数人都非常友好并且乐于提供帮助,这与许多其他语言形成了鲜明的对比。

Doctor_Ryner :Haskell社区经常到处都是聪明的人。 存在关于博士和学术界的模因是有原因的。 在其他社区,人们大多讨论常规的生产问题和数据结构,而在Haskell聊天中,人们讨论单子,应用函子,疯狂类型等。

您将永远学习以前从未想过的东西。

据说Haskell开发人员太忙了。 是真的吗


DS :是的。 我觉得这是因为他们真的很喜欢他们的语言,并对他们的受欢迎程度感到失望。

约翰·多伊(John Doe) :没什么。

Doctor_Ryner :人们可能会说,因为许多主流开发人员对Haskellist感到恼火,所以他们开始谈论函数式编程及其特权。 同时,Haskellist感到恼火,因为没有人听他的话,并开始乱扔术语,因此被贴上“充满了自己”的标签。

IS :给他们打电话有点难。 可能是因为函数式编程,OOP,OOP类和联合类型之间的差异,扩展问题和许多其他定义慢慢地形成了一个连贯的画面,因此很难理解继续进行OOP与FP的圣战的人们。

FP语言为何如此利基?


DS :他们的优势还不足以吸引程序员。 很难学习也无济于事。 工具问题也吓跑了人们,即使如果更多的人感兴趣,这个问题也可能会解决。 这是一个恶性循环。

IS :嗯,FP概念慢慢地渗入其他语言中...

Doctor_Ryner :FP及其语言的核心原则已经相当广泛。 甚至Sharp都有Linq和其他一些类似的库。 但是纯功能语言可能只是有太多新颖的概念无法流行。

别忘了20年前硬件还不够快,无法处理功能语言,因此它只是在最近才进入主流,Haskell本身也在增长。

Source: https://habr.com/ru/post/zh-CN441350/


All Articles