首页 > 解决方案 > 如何在 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

这些类型声明在传达什么信息?

标签: typessyntaxelm

解决方案


左侧命名您将创建的类型。在右侧,您将定义该类型实际可以采用的值。可以只有一个,也可以有你想要的任何数量。

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

许多有用的核心特性,例如MaybeResult实际上是接受参数的类型。它们也被称为抽象类型。要使它们成为具体类型,您需要将具体类型 [^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和返回StringtoMsg一个函数 from StatetoInt等等。

有关更多信息,请参阅https://guide.elm-lang.org/types/custom_types.html

[^1]:像 Haskell 这样的一些语言实际上允许更狂野的类型。https://wiki.haskell.org/Kind


推荐阅读