types - 如何在 Elm 中读取类型定义
问题描述
我应该如何阅读如下的类型定义?
type Config data msg =
Config
{ toId : data -> String
, toMsg : State -> msg
, columns : List (ColumnData data msg)
, customizations : Customizations data msg
}
它似乎有一个“重复”元素:配置存在于 LHS 和 RHS 上。
另一个例子是这样的:
type State =
State String Bool
这些类型声明在传达什么信息?
解决方案
左侧命名您将创建的类型。在右侧,您将定义该类型实际可以采用的值。可以只有一个,也可以有你想要的任何数量。
type MyType = ValueA | ValueB | ValueC
此外,您可以创建其值包含额外数据的类型。这可以通过将值名称(正式称为数据构造函数,或Elm 中的变体)跟随另一种类型来完成。您可以使用任何具体类型并拥有任意数量的类型。变体之间的类型和参数(参数的数量)不需要相同。
type MyType = ValueA String | ValueB Int (List String) | ValueC
这些都是具体的类型。当你有一个值时,它总是有一个具体的类型。假设您要创建自己的配对类型。你可以定义
type PairOfIntAndInt = PairOfIntAndInt Int Int
type PairOfIntAndString = PairOfIntAndString Int String
type PairOfStringAndString = PairOfStringAndString String String
…
但这不是很方便。出于这个原因,Elm 允许您使用带参数的类型构造函数(即 LHS 上类型名称的正式名称)。它们将用小写字母书写:
type Pair first second = Pair first second
许多有用的核心特性,例如Maybe
或Result
实际上是接受参数的类型。它们也被称为抽象类型。要使它们成为具体类型,您需要将具体类型 [^1] 传递给每个参数。
现在,让我们看看你的代码。您有一个带有Config
两个参数的类型构造函数。
type Config data msg =
并且该类型接受使用其一个数据构造函数创建的值
Config
它存储一个值。值的类型实际上是一个组合类型,一条记录。它需要四个字段,它们的类型将取决于类型构造函数的参数。
{ toId : data -> String
, toMsg : State -> msg
, columns : List (ColumnData data msg)
, customizations : Customizations data msg
}
例如,如果您有一个具体的类型Config String Int
,它将期望以下值:
Config
{ toId = someToIdValue
, toMsg = someToMsgValue
, columns = someColumnsValue
, customizations = someCustomizationsValue
}
wheresomeToIdValue
必须是一个函数获取String
和返回String
,toMsg
一个函数 from State
toInt
等等。
有关更多信息,请参阅https://guide.elm-lang.org/types/custom_types.html
[^1]:像 Haskell 这样的一些语言实际上允许更狂野的类型。https://wiki.haskell.org/Kind
推荐阅读
- angular - NgStomp 在 InjectableRxStompConfig 中使用 beforeConnect
- autodesk-forge - 带有 CustomExporter 插件的 Revit 设计自动化中的 FailedMissingOutput 错误
- r - Flexdashboard 速度慢
- angular - 如何使用 ID 在 Ionic / Angular 的嵌套 ngFor 循环中检索记录?
- python - 从提取的人脸图像中提取人脸(调整提取人脸的大小)
- android - 如何在后台处理 FCM 数据消息并运行函数
- sql - 按过去 6 周分组记录,在 oracle 中根据日期查找最近的记录
- php - 使用 php 从 mysql 获取值到具有一些计算的动态添加/删除输入字段中
- cassandra - 不能在 cassandra 上放下桌子
- python-3.x - 如何使用 Python 中的子进程模块与生成的进程动态交互