据说Haskell是一种天才和学者的语言。 对不对



我曾经与一家以色列初创公司的创始人进行过交谈,该公司正在开发高速GPU数据库。 Haskell和C ++都在他们的书架上,创始人抱怨在团队中找人有多难。 他飞往莫斯科,包括寻找优秀的程序员。

我仔细地问,使用更常见和新的方法是否更好。 尽管答案是礼貌而富有建设性的,但在我看来似乎是两句:“ Pff,甚至不要提这些玩具雅普。”

从那以后,我从侧面听到的关于Haskell的所有信息都归结为一件事-“笑话对他不利。” 为了更好地了解Haskellist成员,我来到电报聊天室向他们提问。 结果非常可怕,事实证明,这并非徒劳。

他们不想大众化地谈论Haskell,似乎他们轻蔑地考虑了这些工作。 已经讲过-具有最大的完整性和客观性。 “ Haskell作为语言和社区的特征之一是,他们在一起并没有努力变得流行,而是简单地回答了常见问题。 相反,他们建立了一种逻辑上有原则的方式来解决实际问题,而不是由感兴趣的人迅速进入路人的心脏,”他们在那儿给我写信。

但是,有几个人分享了他们的经验,我在这里收集了他们的意见。

Denis Mirzoev( nolane :在大学里,我以“编程语言”为主题,要求我在Haskell Coursera上一门课程,满分为100分。 然后有一门Haskell进行的函数式编程课程。 他撰写了学期论文和GHC学士学位的研究生论文。 找到了Haskell程序员的工作。

这很难,而且仍然很困难。 当您开始学习Haskell时,您必须理解许多新概念。 这是艰苦的工作。 您实际上会再次学习编程。

现在,许多人将很难回忆起他们是如何开始编程的,了解“指针”是什么,“功能”是什么,“类”是什么困难。 也许这就是为什么研究Haskell如此困难的原因。 随着年龄的增长,学习新事物变得越来越困难。

Doctor_Ryner :在试用期间,我加入了Redux,因此,从其创建者的经验中,我决定更好地了解每个人。 最初,我将学习到的实践应用到JavaScript中,但是后来我了解了Haskell,这是一种真正的功能语言。 它的优雅和一堆我不知道的新概念立即吸引了我。

关于无聊的墨西哥卷饼示例,无休止的教程并非易事,这非常令人困惑。 同样,当务之急的背景使得很难提出新的概念。

Yuri Syrovetsky( cblp :当小鸭综合症没有传给第一语言时,最难学习的是Haskell第二。

什么是好语言,什么是坏语言?


Doctor_Ryner :该语言非常简洁,优雅和灵活,其上的库中有一半是EDSL(至少具有这种印象)。

Yuri Syrovetsky( cblp :高表现力,易于将主题区域转换为代码,是命令式和功能式范例的最佳组合。 在数据和算法上建立抽象很容易,这使您可以思考问题而不会被无关的小事分散注意力。

约翰·杜John Doe) :严格的(我会说法西斯主义)打字。

Igor Shevnin( interphx :一种非常有表现力的类型系统。 它不像Idris或Agda那样强大,但是当几乎所有内容都可以表达时,它到达了中间地带,并且类型推断工作得很好。 您无需在任何地方手动标记它们。

但是强大的类型系统会让您注意传递的值。 一堆类型定义可能看起来像样板。 每个团队都使用自己的一组扩展,或者根本不使用。 代码更加“密集”-一行通常比其他语言包含更多的信息,因此对于没有经验的开发人员来说,阅读它会更加困难。

Doctor_Ryner :当您学习Haskell时,您很可能会遇到这样的说法:“如果编译,那可能是正确的。” 没有空值,功能范式本身非常严格,会迫使您遵循某些规则,这在大多数情况下会导致更好的设计。

例如,语言中没有变量-只有常量。 您不必跟踪分配的内容和位置。 Haskell鼓励使用纯函数,这不会产生任何副作用。 功能设计只是使程序整体工作,而不是OOP,在OOP中,一堆对象被扔到了世界中,对象试图通过副作用相互通信,从而使应用程序变得无法预测。 在工作中,我们在Unity中使用C#遭受了很多痛苦。

Denis Mirzoev :内置的惰性提高了语言的表现力。 许多算法变得越来越容易。 如果不使用中间计算的结果,则可以提高生产率。 (例如,“ head。Sort”以线性时间工作)。

Igor Shevnin :惰性计算模型通常会有所帮助,但是当调用函数的顺序很重要时,可能很难弄清正在发生的事情。

Doctor_Ryner :它被编译,可以立即极大地提高速度。

Denis Mirzoev :在速度上与Java相比,但不及C。

Igor Shevnin :开箱即用,支持扩展,使您可以完成语言和类型系统。 但是,有许多广泛使用的扩展是社区熟悉的,具有不错的示例和文档,并且不是小众市场。

Doctor_Ryner :Prelude标准库的read,head,readFile之类的功能非常差,它们可能引发Exception并放入程序中,而不返回Maybe。 因此,您必须使用替代方法或编写自己的实现。

伊戈尔·谢夫宁(Igor Shevnin) :主要问题是缺乏标准化,在某种程度上,许多人都用一种不兼容的替代品代替了标准库。 在社区中,关于标准库应该是什么,语言的核心应包括什么以及应由扩展进行补充的问题上存在分歧,在我看来这减慢了语言的发展。

Denis Mirzoev :没有足够的工具:没有完善的IDE,很少有用于衡量性能的工具,没有“逐步”调试-通常来说,这是一个基本问题。

Haskell最适合哪些项目?


Yuri Syrovetsky :对于与安全或金钱相关的复杂任务,错误的代价很高。

Doctor_Ryner :适用于您需要进行计算,转换和数据分析的所有内容。 Haskell在数据科学中不如Python流行,对此感到非常惊讶。

伊戈尔·谢夫宁(Igor Shevnin) :我不会冒险将其用于嵌入式系统(性能还不错,但是由于懒惰的计算,仍然存在显着的内存消耗开销)和小的脚本(那里根本不需要这种严格性)。 您还需要了解,与主流语言相比,在团队中寻找开发人员要困难得多。

John Doe :要编写其他人可以阅读的行业代码,您需要一整个团队的Haskellists。 这么少的人设法收集。

伊戈尔·谢夫宁(Igor Shevnin) :但是,由于其简洁和严谨,Haskell几乎可以胜任任何任务。

开始使用Haskell学习开发是一个好主意吗?


伊戈尔·谢夫宁(Igor Shevnin):这不太可能开始,因为一个人必须使用的绝大多数代码库都没有写在上面。

John Doe :不好,不好的主意! 然后,不是来自ML系列的语言,而是来自一般工业语言的语言,将令您感到震惊。

Denis Mirzoev :通常,人们首先学习数学,然后继续编程。 因此,使用数学概念(代数数据类型,纯函数)学习语言应该比命令简单。 也就是说,我认为这是一个好主意。

Doctor_Ryner :我训练的所有新手,我一定会向您介绍Haskell。 尚未研究命令式样式的人可以更轻松地浏览功能代码并更快地学习,然后,即使他们使用面向对象的语言,也可以带来良好的体系结构解决方案和功能实践。

Yuri Syrovetsky :最好以任意顺序立即开始使用几种根本不同的语言,例如C,Haskell和Smalltok。 没有一种语言
单独将不会给予充分的理解。

Haskell是一种相当古老的语言。 是好是坏?


Yuri Syrovetsky:语言正在非常积极地发展,仅出于兼容性的考虑,兼容性的负担不会增加。

John Doe :该标准于1998年采用,但这并不引人注目:到目前为止,该编译器的新版本(可能破坏向后兼容性)大约每六个月发布一次。

丹尼斯·米尔佐耶夫(Denis Mirzoev) :Haskell并不老,但是经过了时间的考验。 漫不经心的改变永远不会融入语言。 很好。

据说Haskell是最复杂的语言之一。 是这样吗


Doctor_Ryner :不喜欢语言本身。 更可能是其中使用的抽象。 一个从未见过Haskell代码的人可能会因新信息流和各种异常构造而发疯。

石油加剧了语言强加一堆“限制”,不允许或极大地使一堆不适合功能概念的事情复杂化的麻烦。

John Doe :对于至少要编译的第一个基础项目,晚上花了将近两个月的时间抽出教科书,手册和教程。 没错,在编译之后,该项目立即开始工作,无花果在满负荷(6k rps,峰值可达15)下运行了六个月,完全没有任何变化。

Denis Mirzoev :我敢打赌,如果一个学生开始从Haskell学习编程并且走得足够远,那么命令式编程在他看来会变得更加复杂和不直观。

伊戈尔·谢夫宁(Igor Shevnin) :复杂性是相对的。 在主流语言中,我仍然发现C ++最复杂。 从概念上讲,证明定理的语言(阿格达,考克)比哈斯克尔要复杂。 Haskell是一种简单的语言,但是它的模式和库(标准库和第三方库)可以立即学习。

它的复杂性总是合理的吗?


Igor Shevnin :模式和高度抽象是合理的,因为它们使代码更可靠,更短。 但是我认为运算符,函数名称和许多其他内容可能会更清楚。

Doctor_Ryner :通常,复杂的Haskell构造使您可以创建非常简短的解决方案,而这些解决方案也非常灵活且模块化。

Yuri Syrovetsky :管理效果很麻烦,尽管几乎
总比没有控制好。 但是过度简化
工作正在进行中。

John Doe :适用于常规python / php /的语言,通常使它看起来与现实正交的语言。 对于最初对分类理论不感兴趣的人,要从绝对零值获得结果非常困难。

但是,当您了解该语言后,便有了一种新的方式来思考所要解决的问题。

Haskell似乎是数学家的语言,而不是开发人员的语言。 您认为它因此不普及吗?


Denis Mirzoev :这是Haskell主要开发人员遵循的原则的例证-“不惜一切代价避免成功”。 当然,重点不是要避免成功,而是要避免成功,而代价太高了。

Haskell可能会受欢迎。 例如,Microsoft支持此语言。 有可能使该语言更加必要,可以做出一些快速而错误的决定,从而获得流行。 可以使用许多肮脏的技巧,但是由于主要开发人员的正确位置,没有什么比这更好的了。

是的,该语言的普及程度不是很高,但是它的质量不会受到影响。 Haskell在命令式语言方面的优势对我来说很明显,他的大多数问题都可以解决,因此我相信随着它的发展,它会受到广泛欢迎。

尤里·西罗韦茨基(Yuri Syrovetsky) :所以只有那些对他一无所知的人才能看到他。 在
Haskell使用“真实”开发已有很长时间了;示例很容易在
您最喜欢的搜索引擎。 特别是我们在LC中使用
Haskell很满意,我们在他的位置上看不到其他任何东西。

伊戈尔·谢夫宁(Igor Shevnin) :我真的不知道什么是“数学家的语言”。 这是用于计算和统计的R / MatLab / Mathematica,或者是Python,因为它简单且需要较少的工程背景。 但不是Haskell。 诸如monoid之类的代数概念是出于实际原因而使用的,而不仅仅是出于额外的严格要求。

C / C ++ / Java / C#在企业中的历史盛行起着普及作用的主要作用,它们占据了一个利基市场。 但是现在,许多公司开始使用Haskell和其他功能语言。

您将Haskell与谁进行比较?


约翰·多伊(John Doe) :或多或少地与Erlang在一起。 但是在我看来,Erlang仍然更容易编写和学习。

Denis Mirzoev :我非常了解C,C ++,Java和Haskell。 C ++甚至不需要与任何事物进行比较,这种语言非常糟糕。 C是用于底层开发的好语言。 在这个利基市场,他会更好。 否则,我更喜欢Haskell。

在Java和Haskell之间进行选择已经比较困难,但是在这里您还需要查看特定任务。 对于Haskell上的android,极有可能很难编写,在这种情况下,Java更好。 但是用Haskell编写的服务器几乎和Java一样方便。 如果环境允许-调优,库的可访问性-那么我通常选择Haskell。

Doctor_Ryner :使用C#,只需使用google即可在C#和Haskell中实现Maybe。 独裁的纯粹的Haskell感觉更加灵活和自由,这是很奇怪的。 实际上,这是两个极端。

C#是最面向对象的语言之一,Haskell的优势与此形成鲜明对比。 在C#中,您经常需要编写一堆不必要的东西,而这一切都是非常不愉快的。 使用高阶函数可能会破坏语法。 在所有这些之中,已经很难从Haskell简短而优雅的解决方案中获得回报。

伊戈尔·谢夫宁(Igor Shevnin) :有了Rust,到目前为止,他都支持Rust。 Haskell和其他FP语言需要花很多时间,但与此同时,功能性方法对命令很友好,并且开发人员和社区从一开始就在开发语言方面更加称职和更加一致。

您如何看待Haskellist社区?


John Doe :绝大多数人都是非常友好的人,他们随时准备为您提供帮助。 与许多其他语言的社区有很大的不同。

Doctor_Ryner :Haskell社区通常包含可怕的聪明人,他们随时准备提供帮助。 关于博士,范畴论和院士的地方模因不是没有意义的。 如果您使用其他语言进行聊天,您会发现人们正在讨论普通的生产问题和数据结构。 在Haskell聊天中,单子,Yoneda的引理,应用函子,编写疯狂的类型等等,立即弹出在您的面前。

您会立即看到很多以前从未知道的新知识-疯狂的构图,优雅的转换和转换,解决问题的解决方案,这些问题占据了主流语言的数十行,几乎是一行。

他们说,哈斯克尔主义者很傲慢。 对不对


丹尼斯·米佐夫(Denis Mirzoev) :是的。 在我看来,傲慢的原因是他们确实热爱自己的语言,并被其低估所困扰。

John Doe :Nifiga就是这样。

Doctor_Ryner :最有可能的是,这种观点已经消失了,因为当Haskelists开始谈论函数式编程及其优势时,许多主流开发人员都非常恼火。 反过来,可怕的误解可能会使Haskelist自己烦恼,并且他将开始急于措辞,对此FAQ表示了鄙视。

伊戈尔·谢夫宁(Igor Shevnin) :傲慢无比 。 这里的重点是,FP,OOP,OOP类与联合类型之间的区别,扩展问题以及许多其他概念一度构成了一个非常清晰的图景,此后,很难理解试图反对OOP和FI的人们,或者以其他方式想象从狭perspective的角度来看普遍存在的问题。

为什么FP语言仍然是利基市场?


Denis Mirzoev :他们的优势仍然不足以吸引大量程序员。 学习困难不利于普及。 调优的问题也吓倒了许多人,但在我看来,仅增加社区规模就可以解决这个问题。 事实证明这是一个恶性循环。

伊戈尔·谢夫宁(Igor Shevnin) :生态位正在逐渐消失 ,功能概念也被引入其他语言。

Doctor_Ryner :功能原理本身以及支持它们的语言已经无处不在。 即使是急刀,也有Linq和其他一些库。 利基语言是纯粹的功能语言,因为它们使用非标准概念。

别忘了20年前,铁对于功能语言的生产率还不够高,因此功能主义在最近几年开始进入主流,并且对Haskell的兴趣也在不断增长。

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


All Articles