龙空技术网

值得探索以改善编码风格的5种编程语言

闻数起舞 541

前言:

此刻各位老铁们对“fp编程器”大致比较关怀,你们都想要剖析一些“fp编程器”的相关内容。那么小编同时在网上网罗了一些对于“fp编程器””的相关资讯,希望咱们能喜欢,我们快快来学习一下吧!

"为什么这段代码如此混乱? 为什么这个问题很难表达? 这段代码到底是怎么回事?"

诸如此类的问题使我多次寻求编程语言的圣杯。 我还没有找到圣杯,但是就像每一次旅行一样,我变得更聪明,更有经验。

长期以来,程序员一直在寻找向计算机表达自己的最佳方式。 在曾经创造的所有语言中,只有少数发展成为广泛的行业标准。

像我一样,您可能正在使用经过考验的流行技术,并尝试使其以最佳方式工作。 但是我们都知道事情不是完美的-它们的缺点会影响我们的神经和耐心。

这是我尝试过的语言的简短列表,这为我的日常工作带来了一些好处。 虽然不是大多数语言的专家,甚至不是常规用户,但我对这些语言进行了很多有趣的尝试,而且我想认为它们只是使我总体上成为一个更好的程序员。

ML语言(F#/ OCaml)

对于第一个条目,我想向您介绍ML系列的语言。 这不是我第一次进入函数式编程(FP)世界。 然而,正是这一点使我对它的实际工作方式有了真正的实际了解。

尽管两种语言都支持多种范例,但它们最适合于函数式编程。 它们不像Haskell那样严格和纯净,因此您可以将您的脚趾浸入函数式编程风格中,而无需太多的初期挣扎和挫折。

我真的很喜欢通过匹配和破坏来控制流程是多么容易。 F#能够一目了然地可视化函数的流程。 无论语言如何,我都会努力将其纳入代码中。

多亏了ML语言,我在类型的组成和设计方面变得更好。 即使F#会尝试从您编写的核心代码中猜测您的类型,它也是一种强类型化的语言。

F#非常适合学习序列上的功能样式操作。 这是任何FP第一语言的共同特征。 折痕,地图压缩等与FP编程器工具箱中的锤子等效。 易于使用的语法支持着重于此元素,将帮助您训练大脑以了解可以抽象为序列操作的问题。

如果您具有OOP(面向对象编程)的经验,那么学习F#是进入函数式编程世界的绝佳的第一步。 如果遇到困难,您总是可以回到日常的对象和课程。 F#将它们与其他代码混合在一起,而不必大惊小怪。

如果您具有C#的经验,则F#与.NET的互操作性也将为您带来很大的帮助。 您仍然可以使用可信赖的.NET工具和nuget包。

我只能建议您尝试一下。 没有非常陡峭的学习曲线,这很有趣。

但是,如果您不害怕陡峭的学习曲线,则可以直接跳至:

Haskell

现在,Haskell一直是(现在仍然是)我要时不时地挑战。 即使我从未完成过任何大型项目,但我始终喜欢与之合作的精神挑战。

Haskell编程从一开始就是一种残酷的经历……老实说,它仍然是。 Haskell不是一种蓬松的用户友好型ML语言。 这种语言将迫使您对FP进行编程并正确编程。

您必须正确设计类型。 您必须精确地计划功能。 而且对实现没有任何欺骗,如果您说此功能会做某事,则必须兑现您的承诺。 没有一半的实现,没有漏掉的案例或"其他"。

但最重要的是,没有隐藏的副作用。 如果您说您的函数将获得一个字符串并取回该字符串,则编译器将强制您兑现您的承诺。 没有打印调试信息,没有读取用户输入。 您说过您会得到一个琴弦并只将琴弦还给您,不是吗?

使用这种语言确实可以使您的大脑注意所承诺的声明功能(或方法)的内容。

即使这种严格性不能总是很好地翻译成C#之类的语言,但它会使您更加了解,并会促使您谨慎地声明函数,以便其他用户不会感到不愉快。 一两年后再回到自己的代码时,这将为您节省一些咒骂。

我知道当我修改传递给该方法的任何参数时,我的大脑会立即发出警报。 我需要那个吗? 我是否警告过潜在用户该功能会干扰他/她的数据?

当我开始学习Haskell时,它是一种奇怪的语言。 我已经知道Haskell程序员坐在编程象牙塔的顶层。 我还发现,显然奇怪的生物正在悬停在塔顶顶部上方(笑话归于ScottW)。

这些人在编程:

LISP系列:通用LISP,Clojure,Scheme

对于像我这样来自C家族的任何人来说,这都是一个真正的陌生人。 第一次困惑地看一下代码,第一次斜视是由一群大括号拥抱这些陈述引起的。 啊,回忆!

我进入LISP世界的第一步是通过Clojure。 我只是在书店里浏览,当时一本关于Clojure的书引起了我的注意(出于对我的爱,我不记得那本书是哪本书)。 我把它带回家,冒险开始了。 或者,确切地说,是一个天又一个难题地解决,并试图了解如何使用该工具的日子。 几周后我放弃了,一年后又回来了。 并再次放弃。 然后,我找到了Common LISP,然后再次使用它,但是这次有了发现我的文本编辑器(也许是操作系统)想要的EMACS的附加价值。

我不记得在这个周期中什么时候点击了。 大括号融合到背景中,剩下的只是一个清晰的提示。 如果您在LISP中发现一件事,那就太优雅了。 我绝对不会说我可以用LISP编写顶级代码,但是阅读经验丰富的程序员的代码是一种敬畏和嫉妒的经历。 我希望有一天,我将有技能来编写能很好地说明自己的程序。

如果我可以证明这些语言的出色表现,那么即使我没有足够的知识亲自编写该程序,我仍然可以理解该程序的意图。

所有这些都归功于简单而灵活的设计。 最重要的是,有一个我所不知道的宏系统。 通过支持语法构造,这使您可以围绕已解决的问题编写程序。

另一个重要功能是使用REPL进行交互式实验性编程。 编写活动代码鼓励进行试验,并允许您在提交给代码的一种设计之前检查许多想法。

即使我在工作中不使用LISP,它仍然是一个很好的工具,而且我在经常被引用的句子"发现学习LISP将使您成为更好的程序员"中发现了事实。 我不知道我是否可以通过LISP成为一个更好的程序员,但这无疑扩大了我的视野。

Rust

当我处理C ++ pet项目时,我首先发现了Rust。 我不讨厌或鄙视C ++,但是使用它的任何人都知道,有时C ++可能会令人讨厌。

C ++所提供的复杂性和自由度令人惊叹,但也可能使人不堪重负,甚至失去希望……

如果您从未在其中编写过中型或大型项目,那么让我告诉您,它很快就会变得混乱。

这种语言庞然大物背后的驱动思想是,无缘无故应该阻止开发人员用自己的脚射击……或者恰好是现在出现的20英尺,而您不确定他们是如何到达这里的。 同样,您的原始脚在某处,但您不确定该在哪里。

无论如何。 Rust用RAII范式的严格性和自以为是的AF解决了这个问题。 类似于Haskell的方式,编译器始终处于工作状态,并确保您正确构建程序。

主要目标是:如果编译,它将正常工作。

用Rust写作就像与一个愤怒的教练合作,他会在一点点滑倒的情况下纠正您。

这是一个好习惯,尤其是在您无法正确设置内存管理的情况下。

每次查看Rust时,Rust似乎都会得到重大改进。 即使它不能代替C ++代替中级通用语言,还是有一个好的竞争者仍然很不错。

SmallTalk

我的朋友在有关面向对象和功能范式的酒吧辩论中向我推荐了这个。 在啤酒的充分刺激下,我站在一位功能编程的新手的立场上,他认为这种新的范例将解决我所有的问题,即使不是世界上的问题。

我被一个简单的论点反驳:

试试Smalltalk,看看面向对象的编程是否真的没有用。

所以我尝试了并且感到谦虚。 原来,我不知道如何执行OO。 Smalltalk是特定的。 大多数实现:Pharo,Squeak等将为您提供完整的IDE,这几乎就像是为开发而构建的小型操作系统。

它为您提供了完成任务的所有工具,但最重要的是,它强烈建议工作流向您展示如何以我所说的Smalltalk方式进行开发。

因此,您要发表评论,也要编写测试。 您需要将对象和函数命名和分类为适当的对象,协议和包。

叫我疯了,但是当我以正确的方式做事时,我觉得法罗几乎为我感到骄傲。

事实证明,正确的方法可以花很多时间。

语言本身非常简单,您可以在不到15分钟的时间内轻松学习语法。 没有技巧,没有语法糖。 它为您提供了足够的工具来完成工作,因此您可以做到。 您不必费心去寻找应该使用的语言工具-别无选择。 我觉得它可以让我的大脑将所有精力集中在手头的工作上。 它对我有用,也许对您有用。

后记

我在本文中跳过了一些语言。 其中一些是如此广泛,以至于您可能以其他形式(例如Python / Java / C ++ / C#等)看到了它们。

有些人我没有遵守规则,即如果您无话可说,那就什么也不要说(我看着您JavaScript,ekhm)。

有些,例如Ruby,Scala,Perl,我还没有尝试过。 希望以后能对这些有所了解。

无论您有类似的学习经历还是完全不同的学习经历,我都希望收到您的评论。

干杯!

(本文翻译自Roargh的文章《5 Programming Languages Worth Exploring to Improve Your Coding Style》,参考:)

标签: #fp编程器