如何在Elm中读取类型定义

时间:2019-01-30 22:12:26

标签: types syntax elm

我应该如何阅读如下类型的定义?

my_variable = 7

if __name__ == "__main__":
    ...

似乎有一个“重复”元素:LHS和RHS上存在 Config

另一个例子是

type Config data msg =
  Config
    { toId : data -> String
    , toMsg : State -> msg
    , columns : List (ColumnData data msg)
    , customizations : Customizations data msg
    }

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

1 个答案:

答案 0 :(得分:6)

左侧会命名您要创建的类型。在右侧,您将定义类型可以实际使用的值。您可能只需要一个或多个。

type MyType = ValueA | ValueB | ValueC

此外,您可以创建其值包含额外数据的类型。这可以通过在值名称(在Elm中正式称为数据构造函数 variant )后面加上另一种类型来实现。您可以使用任何具体类型,并且可以有任意数量。变体之间的类型和参数(参数的数量)不必相同。

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允许您使用带有参数的 type构造函数(即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
}

其中someToIdValue必须是接受String并返回StringtoMsgStateInt的函数的函数,以及等等。

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

[^ 1]:有些语言(例如Haskell)实际上允许使用更野的类型。 https://wiki.haskell.org/Kind