类型
Elm 的主要优点之一是用户实际上看不见运行时错误。这是可能的,因为 Elm 编译器可以非常快速地分析你的源代码以查看值如何流经你的程序。如果某个值可能以无效的方式使用,编译器将通过友好的错误消息告诉你。这称为类型推断。编译器会找出所有函数中的流入和流出值的类型。
类型推断示例
以下代码定义了一个 toFullName
函数,该函数将一个人的全名作为字符串提取出来
toFullName person =
person.firstName ++ " " ++ person.lastName
fullName =
toFullName { fistName = "Hermann", lastName = "Hesse" }
就像在 JavaScript 或 Python 中一样,我们只需编写代码,而无需额外的干扰。但你看到 bug 了吗?
在 JavaScript 中,等效代码会吐出 "undefined Hesse"
。甚至不会出现错误!希望你的某个用户在野外看到它时会告诉你。而 Elm 编译器只会查看源代码并告诉你
-- TYPE MISMATCH ---------------------------------------------------------------
The argument to function `toFullName` is causing a mismatch.
6│ toFullName { fistName = "Hermann", lastName = "Hesse" }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Function `toFullName` is expecting the argument to be:
{ …, firstName : … }
But it is:
{ …, fistName : … }
Hint: I compared the record fields and found some potential typos.
firstName <-> fistName
它会看到 toFullName
获取了错误类型的参数。正如错误消息中的提示所说,有人不小心写了 fist
而不是 first
。
对于这样简单的错误,有一个助手很有用,但当你拥有数百个文件和许多协作者进行更改时,它的价值会更高。无论事物变得多么庞大复杂,Elm 编译器都可以仅根据源代码检查所有内容是否正确地结合在一起。
你越了解类型,编译器就会感觉更像一个友好的助手。因此让我们开始学习更多内容吧!