为什么有人会费心学习过时的语言。 F#社区的案例研究



我们都听说过标志性的电影,游戏,书籍或音乐作品,这些作品都得到了唱片制作人,专业人士和评论家的热烈赞扬,但似乎从未引起任何实质性的商业成功或更广泛的受众的注意。 这种情况使我深感沮丧。

在开发方面,好的技术有时也永远不会引起人们的关注。 以F#为例。 我所知道的是,它是一种超酷的语言,但是却完全不受欢迎,这使得开发人员(一经了解)便难以回到他们惯用的语言。

我试图找出背后的故事。 实际上,使用该语言的人是谁?如果该语言在业务中需求不足,他们为什么要这样做? 为了找到答案,我加入了Telegram上讲俄语的F#社区-我们的讨论圆桌会议。

您是如何开始学习F#的?


Ayrat HudaygulovSzer ):我最初是从C#迁移到这里的。 我们曾经做过与Akka.NET有关的工作-Akka的Scala港口。 port本身很好,但是尽管Scala手册中总是提供这些示例,但在用户手册中却缺少罕见案例的示例。 在阅读该手册时,我一直在想-为什么在Scala中写它只需要几行,而在C#中却很难做同样的事情?

我看到了切换到F#的解决方案。 从那以后我再也没有想过。

Roman Limankagetoki ):事实证明,它是解决任何开发人员可能面临的实际日常问题的强大工具。 在C#和Java世界中,以前被视为OOP不可避免的规范的障碍实际上并不是那么不可避免,可以轻松地预防而不是克服。

Phil Ranzhinfillpackart ):我曾经在Habr上接受Vagif Abilov的长时间采访。 那时我只是无法掌握函数式编程的范式,因此任何相关信息都将使我大为恼火。 那次采访也不例外。

Vagif AbilovVagifAbilov ): 这是有关文章的链接 。 在莫斯科DotNext会议上发表演讲后不久,我就这样做了。 简而言之,我开始学习F#,是为了使我的代码更简洁(更少的代码等于更少的邪恶)并利用持久性数据结构。 当然,没有什么可以阻止C#或Java开发人员将其数据结构声明为持久性的,但是对数据结构进行突变的功能是OOP语言的一项基本功能,并且始终是它们固有的。 函数式编程可以节省您通常在保护数据免受多线程环境中的不适当突变影响上所花费的精力-数据将自理,因为它们是不可变的。

Phil Ranzhin :Vagif一直说在严格的C#和Java之后,F#似乎更易于开发。 我当时不知道Vagif是谁,但我自然认为这家伙没有丝毫线索。 C#并不过分正式,而C#正是应有的方式。 它强大而美丽。 我决定写一篇关于毕竟功能编程多么荒谬的文章。 我提出了一个简单的问题,并开始在C#和F#中实现它,以证明我的观点。 但是,当我在进行这项工作时,我非常喜欢F#,因此放弃了这篇文章。 相反,我开始更深入地研究这项技术。

罗曼·利曼(Roman Liman) :C#在运行时验证的大部分内容现在都在编译时处理,因此感觉就像是第一次使用静态类型-真是一个启示。

在不夸张的情况下,在F#中需要七行代码,您将需要200-300行才能在C#中编写等效代码(仅考虑有用的代码)。 编译器将为您完成所有样板生成,例如结构相等性。

Phil Ranzhin :我从未真正调试过F#代码,因为在我的F#代码中,所有错误在编译期间都会被清除。 我不是在开玩笑。

学习F#很难吗?


罗曼·利曼(Roman Liman) :学起来有多难? 我会说,一点也不难。 如果您以前从未处理过函数范式和不可变类型,则可能一开始很难解决。 但是,这个问题与范式之间的切换有关,而与语言无关。

语法一开始并不明显,所以请驯服您的傲慢并阅读有关该语言的内容,不要希望您会对C#有所了解。

Ayrat Hudaygulov :F#支持C#所做的一切,但goto除外(由于该语言完全基于表达式,因此在可计算表达式中进行命令式跳转似乎很奇怪)和protected关键字(显然是设计使然。加上它就可以了。 我们喜欢的所有其他有关OOP的内容-抽象类,接口,自动实现的属性,使用,try-catch等。 -全部在那里。 字节计数爱好者也将对ref / out参数,可变性,跨度,非托管,指针,stackalloc感到满意。

与F#(泛型,异步/等待+任务,LINQ,模式匹配等)相比,所有C#功能的添加都要延迟几年。 而且,许多功能可能永远都不会适用于该语言(求和类型为可区分的并集,本机函数currying)。 预计将通过记录和递归模式匹配来增强即将发布的C#8.0。 问题是,为什么要等待?

另一个问题是:为什么要学习一种新语言以旧方式使用它? 要真正接受C#中缺少的F#的优势,您将必须了解Force的另一面。 没有人说这很容易。

John Doe :作为C#开发人员,我非常感谢F#的创建者在C#中使用人性化的泛型和异步编程。 对于那些不知道的人,感谢F#的帮助,这些大型功能才出现在C#中。

Vagif Abilov :受欢迎的Pragmatic Development的作者建议开发人员每年学习一种新的编程语言。 我不能说我虔诚地遵守这一建议,但是我想作者真的很想说,开发人员必须始终准备好修改他们编写代码的原则。

许多人喜欢自己的信念,喜欢编程语言。 有些人会把从Java到Clojure的转变视为从基督教到伊斯兰教的转变。 为什么在地球上那么重要? 学习新的编程语言通常将使我们有机会重新考虑使用已知语言的旧方法。 熟悉F#使人们以新的方式编写C#代码。

Roman Melnikovneftedollar ):F#的OOP部分更合适(尽管它与OOP的C#版本完全兼容),因为它鼓励您使用抽象接口而不是显式类进行编程。

您如何看待这种语言的设计师?


Nikolay Matyushin :我曾经帮助将数据类型提供程序的支持引入.NET Core。 他们不会工作很长时间,因此,在征募了一个俄语社区的另一位成员之后,我下定决心要找出真正的错误所在。 经过一番挖掘,我们发现.NET Core缺少将程序集对象保存到文件的功能-类型提供程序需要此功能。

我们花了一两周的时间来开发能够做到的原型。 我们整理了一个凌乱的hack,但是它起作用了(至少在某种程度上)。 一直以来,我们一直发布到Github的Issues上,直到Don Syme突然出现,并说这是“几个小时的工作”并修复了类型提供程序。

Vagif Abilov :语言设计师Don Syme平易近人且思想开放。 我希望他有一天会冒险参加一些俄罗斯会议,以亲自见到俄罗斯开发商。

罗曼·利曼(Roman Liman) :西米(Syme)是个天才。 令人难以置信的是,在这个漂亮的设计背后,他几乎是一个人。

Pavel Smirnov :他是我在编程领域的榜样。

Ayrat Hudaygulov :顺便说一句,Don Syme是将泛型引入.NET的人,否则我们仍然会在C#中硬转换从对象到对象的所有内容,就像Java中(部分是)情况一样。 Syme通过回顾C#和其新功能的兼容性来发展该语言,从战略的角度来看,这可能是正确的选择。 但是,这意味着C#中决策错误的余味也可能渗入F#中。 他还反对引入讨厌的FP功能(您好Scala!)和语言的过于复杂化,因为所有这些都会吓other其他人并肿标准库(您好C ++!)。

我认为Syme是英雄。 我支持他将语言视为一种多范式的观点,但是,我可能会为该语言添加更多功能。

为什么该语言不是很流行?


罗曼·利曼(Roman Liman) :我想说这种语言并不流行,因为FP通常不如OOP流行。 此外,学习曲线比较陡峭。 剩下的就是Catch 22的情况。 很少有项目用F#编码,因为市场上缺少F#程序员,而程序员则不学习这种语言,因为市场上缺少相关项目。

Phil Ranzhin :我不知道有人会练习函数式编程,同时又偏爱面向对象的模型。 从这个意义上讲,F#尤其不幸,因为它仅对那些相信两种范例的共生结合的人有效。

帕维尔·斯米尔诺夫(Pavel Smirnov) :许多人认为这是一个死胎,因为微软的政策是使F#成为一个用于C#功能的平台。 但是,该语言最初是针对数据科学而非工业发展的。

罗曼·梅尔尼科夫(Roman Melnikov) :锐化器。 对于C#来说,这是必不可少的东西,许多人已经在其中进行了投资。 考虑到手动配置的数量(例如突出显示分配),在没有ReSharper的情况下编写C#代码是一项艰巨的工作。 因此,ReSharper减轻了C#开发人员的烦恼。 F#最初并没有造成这种痛苦,但是使用ReSharper的人不能真正欣赏不依赖工具的语言的整体美感。

Vagif Abilov :在我看来,它落后于Scala成功的原因在于Microsoft的主导地位,它仍然决定了Windows平台的优先级。 尽管F#是在Microsoft Research中开发的,但该公司一直将其定位为发烧友的一种语言。 Microsoft具有自己的度量标准,该度量标准基于当前的销售业绩来发展特定技术的经济可行性,因此,根据这些度量标准,可以肯定的是,SharePoint之类的项目看起来比F#更具吸引力。 然而,小小的笔触落在了橡树上。

菲尔·兰欣(Phil Ranzhin) :我相信它会起飞。 .NET的功能与最现代的语法和空前的惯用语言概念相结合,势必将脱颖而出。

罗曼·梅尔尼科夫(Roman Melnikov) :未来看起来前途无限。 例如,感谢类型提供程序,F#为数据分析铺平了道路。 还有js编译器和神奇的elmish库(实际上是.NET的Elm)。

Miguel de Icaza是F#的狂热支持者,因此Xamarin一直具有与C#相同水平的F#支持。 ErlangCore中还有一个编译器,它也很棒。 F#可用于对后端和前端进行编码。 SAFE-Stack令人赞叹不已,其中包含类型化的API调用,出色的Web套接字包装程序(Elmish。Bridge)和大量其他内容。

Vagif Abilov :很高兴听到在实践中使用了F#。 我正在一家挪威广播公司的项目中工作,该系统将电视和广播媒体文件上传到云中,以使它们可从计算机和移动设备进行播放。 该系统使用F#编写,并利用Akka.NET。 这不是我们组织在F#中唯一的项目,更有希望的是,此类项目的数量会增加,而愿意切换到该语言的开发人员的数量也会增加。

F#有什么用?


Phil Ranzhin :F#非常适合AI开发。 这种语言的字面意思是将我的思想与任何麻烦区分开来,并专注于重要内容。 当您使用AI时,您的任务是根据机器的行为调整思维方式。 在这种情况下,您的代码是您的中间语言,无法描述过于复杂的想法。 但是F#的抽象能力足以让您和您的机器创造历史。

Vagif Abilov :它可用于解决任何问题,特别适用于域驱动设计。 在我去年对Habr的采访中,我很愚蠢地指出,功能语言适用于算法和后端的程度要大于适用于用户界面和网页编程的程度。

然后有人在评论部分提到了一种功能语言Elm,它是专为编程网页而设计的。 发表评论的人是绝对正确的。 从那时起,我开始使用Fable,它允许使用F#编写Web应用程序并将其编译为JavaScript。 效果非常出色:F#和Fable(以及Fable-Elmish库)的组合为像我这样受CSS挑战的开发人员开放了Web编程的访问权限。

Pavel Smirnov :数据驱动的开发-它是一种简洁的FP语言,具有类型提供的支持。 作为标准库的一部分,其MailboxProcessor actor模型非常有用!

Roman Melnikov :它完美地解决了网络问题,并与React组件很好地集成在一起。 它解决了数据分析和机器学习问题(fslab.org),ETL问题,业务逻辑设计问题-其类型系统允许以避免错误状态的方式进行编码。
它可以很好地进行解析(Fparsec)。 这对于设计和解释自己的语言非常有用。 只需使用TypeScript-它最初是用F#编写的。 它可以用来编写GPU代码。
我自己使用F#代替bash和Python为我的计算机编写fsx脚本。

的确,您不能使用它来编程微控制器。 但是我想很多人都可以做到这一点。

在哪里获取信息


书本




网际网路



电报


fsharp_news
fsharp_chat

社区简介


Roman Liman :社区很棒:它受到在F#中进行商业编码的渴望的驱使,因此欢迎新手并提供大量支持,以扩大社区并增加成员找到工作的机会。

菲尔·兰钦(Phil Ranzhin) :那些危险的邪教追随者! 但是他们是对的。

Pavel Smirnov :讲俄语的F#社区是一个不错的地方。 我最喜欢的是,他们真正关心自己喜欢的语言,就像人们在其他更知名的生态系统中所做的一样。

Nikolay Matyushin :那可能是因为该语言不是很流行,所以有毒的人不会留下来。

罗曼·梅尔尼科夫(Roman Melnikov) :社区中有一些戏剧,它们不影响语言本身,但会使生活更加精彩。

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


All Articles