榆树文件 - "a"是什么意思?

ste*_*eel 5 elm

榆树文档没有给出示例用法,因此很难理解类型规范的含义.在一些地方,我看到"a"用作参数标识符,就像在Platform.Cmd中一样:

map : (a -> msg) -> Cmd a -> Cmd msg
Run Code Online (Sandbox Code Playgroud)

这是什么意思?我该怎么用Cmd.map

dan*_*ula 5

以下是关于阅读类型注释榆树指南的一部分:

> [ "Alice", "Bob" ]
[ "Alice", "Bob" ] : List String

> [ 1.0, 8.6, 42.1 ]
[ 1.0, 8.6, 42.1 ] : List Float

> []
[] : List a
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我们有一个填充字符串值的List.在第二个中,List填充了Float值.在第三种情况下,列表为空,因此我们实际上并不知道列表中的值是什么类型.所以类型列表a说"我知道我有一个列表,但它可以填充任何东西".小写字母a被称为类型变量,这意味着我们的程序中没有约束将其固定为某种特定类型.换句话说,类型可以根据其使用方式而变化.

在您的情况下,作为第一个参数,您应该传递一个函数,该函数将从第二个参数获取类型的变量并返回类型为msg的值.


sth*_*lzm 4

a是一个类型变量。将其视为可以用任何其他类型替换的占位符。但是,a一种类型签名中的所有出现都必须用相同的具体类型替换。

那么如果map有这个签名...

(a -> msg) -> Cmd a -> Cmd msg
Run Code Online (Sandbox Code Playgroud)

...这将是一个有效的替代:

(Bool -> MyMessage) -> Cmd Bool -> Cmd MyMessage
Run Code Online (Sandbox Code Playgroud)

msg是另一种类型变量)

...虽然这是一个不正确的替换:

(Bool -> MyMessage) -> Cmd MyMessage -> Cmd Bool  -- note the mismatched type variables
Run Code Online (Sandbox Code Playgroud)

拥有类型变量提供了很大的灵活性,因为像这样的通用函数map可以与各种不同类型重用。