榆树文档没有给出示例用法,因此很难理解类型规范的含义.在一些地方,我看到"a"用作参数标识符,就像在Platform.Cmd中一样:
map : (a -> msg) -> Cmd a -> Cmd msg
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我该怎么用Cmd.map?
> [ "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的值.
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可以与各种不同类型重用。