我应该如何阅读如下类型的定义?
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
}
这些类型声明在传达什么?
答案 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
许多有用的核心功能,例如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
}
其中someToIdValue
必须是接受String
并返回String
,toMsg
从State
到Int
的函数的函数,以及等等。
有关更多信息,请参见https://guide.elm-lang.org/types/custom_types.html
[^ 1]:有些语言(例如Haskell)实际上允许使用更野的类型。 https://wiki.haskell.org/Kind