【发布时间】:2022-11-30 05:09:26
【问题描述】:
我正在阅读与语法相关的 Elm documentation,并偶然发现了这个 sn-p:
type User
= Regular String Int
| Visitor String
Regular 和 Visitor 是什么类型?另一种以前从未定义过的类型?还是一个功能?
它确实像一个函数调用,但参数是一个类型,它看起来不像函数签名,因为没有->
【问题讨论】:
我正在阅读与语法相关的 Elm documentation,并偶然发现了这个 sn-p:
type User
= Regular String Int
| Visitor String
Regular 和 Visitor 是什么类型?另一种以前从未定义过的类型?还是一个功能?
它确实像一个函数调用,但参数是一个类型,它看起来不像函数签名,因为没有->
【问题讨论】:
这记录在 Elm Guide 的相关部分(请注意,这是从您在问题中链接到的语法指南中的部分链接到的),但我承认它对初学者来说并不像它那么清楚应该。
在您的示例中,Regular 和 Visitor 确实是函数,而不是类型。 (在 Haskell 和 PureScript 中,它们将被称为“(数据)构造函数”,它本质上可以用作常规函数,但具有可用于定义它们的类型的模式匹配的额外功能。Elm 有很多差异来自这两种语言,但有很多相同的根源,实际上你也可以在 Elm 中以这种方式做 pattern matching。)
我链接到的页面上的 REPL 示例证明了这一点,以下是逐字复制和粘贴的内容:
> type User
| = Regular String Int
| | Visitor String
|
> Regular
<function> : String -> Int -> User
> Visitor
<function> : String -> User
就像 Elm 中的所有函数(同样在 Haskell 等中)一样,这些函数会自动柯里化,因此在您的示例中,Regular "something" 是 Int -> User 类型的函数。
如您所见,“它看起来不像函数签名”——事实并非如此。这不是您定义典型函数的方式。它是自定义数据类型的定义,然后免费为您提供这些“构造函数”。
【讨论】: