核心要点
Elm 是一种函数式编程语言,最近吸引了相当多的关注。本文探讨了它是什么以及为什么你应该关注它。
Elm 当前的主要关注点是使前端开发更简单、更健壮。Elm 编译成 JavaScript,因此可用于为任何现代浏览器构建应用程序。
Elm 是一种具有类型推断的静态类型语言。类型推断意味着我们不需要自己声明所有类型,我们可以让编译器为我们推断许多类型。例如,通过编写 one = 1
,编译器知道 one
是一个整数。
Elm 是一种几乎纯函数式编程语言。Elm 基于许多函数式模式,例如纯视图、引用透明性、不可变数据和受控副作用。它与 Haskell 和 Ocaml 等其他 ML 语言密切相关。
Elm 是反应式的。Elm 中的一切都通过信号流动。Elm 中的信号会随时间推移传递消息。例如,单击按钮会通过信号发送消息。
您可以将信号视为与 JavaScript 中的事件类似,但与事件不同的是,信号是 Elm 中的一等公民,可以传递、转换、过滤和组合。
Elm 语法
Elm 语法类似于 Haskell,因为两者都是 ML 家族语言。
greeting : String -> String greeting name = "Hello" ++ name
这是一个接受一个字符串并返回另一个字符串的函数。
为什么使用 Elm?
为了理解为什么你应该关注 Elm,让我们讨论一下过去几年中的一些前端编程趋势:
不久以前,我们通过手动更改 DOM 来构建应用程序(例如,使用 jQuery)。随着应用程序的增长,我们引入了更多状态。必须对所有状态之间的转换进行编码会成倍地增加应用程序的复杂性,从而使其更难以维护。
与其这样做,React 等库普及了关注描述特定 DOM 状态然后让库为我们处理 DOM 转换的概念。我们只关注描述离散的 DOM 状态,而不是我们如何到达那里。
这导致需要编写和维护的代码大大减少。
在应用程序状态方面,通常的做法是自己更改状态,例如向数组中添加注释。
与其这样做,我们只需要根据事件描述应用程序状态需要如何更改,然后让其他东西为我们应用这些转换。在 JavaScript 中,Redux 使这种构建应用程序的方式流行起来。
这样做的优点是我们可以编写“纯”函数来描述这些转换。这些函数更容易理解和测试。一个额外的好处是我们可以控制应用程序状态的更改位置,从而使我们的应用程序更易于维护。
另一个好处是我们的视图不需要知道如何更改状态,它们只需要知道要分派哪些事件。
另一个有趣的趋势是让所有应用程序事件以单向方式流动。与其允许任何组件与任何其他组件通信,我们通过中央消息管道发送消息。这个中央管道应用我们想要的转换并将更改广播到应用程序的所有部分。Flux 就是一个例子。
通过这样做,我们可以更好地了解应用程序中发生的所有交互。
可变数据使得很难限制其更改位置,因为任何可以访问它的组件都可以添加或删除内容。这会导致不可预测性,因为状态可以在任何地方更改。
通过使用不可变数据,我们可以通过严格控制应用程序状态的更改位置来避免这种情况。将不可变数据与描述转换的函数相结合,我们可以获得非常强大的工作流程,并且不可变数据有助于我们通过不允许我们在意外位置更改状态来强制执行单向流。
前端开发中的另一个趋势是使用集中的“原子”来保存所有状态。这意味着我们将所有状态放在一棵大树中,而不是将其分散在各个组件中。
在一个典型的应用程序中,我们通常有全局应用程序状态(例如,用户集合)和组件特定状态(例如,特定组件的可见性状态)。将这两种状态都存储在一个地方是否有益是有争议的。但至少将所有应用程序状态保存在一个地方有一个很大的好处,那就是在应用程序的所有组件中提供一致的状态。
另一个趋势是使用纯组件。这意味着给定相同的输入,组件将始终呈现相同的输出。这些组件内部没有发生副作用。
这使得理解和测试我们的组件比以前容易得多,因为它们更易于预测。
这些都是使应用程序更健壮、更易于预测和维护的优秀模式。但是,要在 JavaScript 中正确使用它们,我们需要谨慎避免在错误的地方做一些事情(例如,在组件内部更改状态)。
Elm 是一种从一开始就考虑了许多这些模式的编程语言。它使采用和使用它们变得非常自然,而无需担心做错事。
在 Elm 中,我们通过使用以下方法构建应用程序:
Elm 的另一个巨大优势是它提供的安全性。通过完全避免值为空的可能性,它迫使我们处理应用程序中的所有备选路径。
例如,在 JavaScript(和许多其他语言)中,您可以通过执行以下操作来获得运行时错误:
greeting : String -> String greeting name = "Hello" ++ name
这将在 JavaScript 中返回 NaN,您需要处理它以避免运行时错误。
如果您在 Elm 中尝试类似的操作:
var list = [] list[1] * 2
编译器将拒绝此操作,并告诉您 List.head list
返回 Maybe 类型。Maybe 类型可能包含也可能不包含值,我们必须处理值为 Nothing 的情况。
list = [] (List.head list) * 2
这为我们的应用程序提供了很大的信心。在 Elm 应用程序中很少看到运行时错误。
(以下部分与原文类似,略作调整,避免重复)
(Sample Application, Let’s go over it piece by piece 等部分,由于篇幅过长,此处省略。原文已充分描述了代码功能,此处不再赘述。)
结论
Elm 是一种令人兴奋的编程语言,它采用了构建可靠应用程序的优秀模式。它具有简洁的语法,内置了许多安全功能,可以避免运行时错误。它还有一个优秀的静态类型系统,这在重构过程中非常有帮助,并且由于它使用类型推断,因此不会妨碍开发。
学习如何构建 Elm 应用程序的学习曲线并非易事,因为使用函数式反应式编程的应用程序与我们习惯的不同,但这是值得的。
(Additional Resources, Frequently Asked Questions 部分,由于篇幅过长,此处省略。原文已充分描述了相关信息,此处不再赘述。)
以上是用ELM的功能反应性编程:简介的详细内容。更多信息请关注PHP中文网其他相关文章!