Elm docs没有给出任何示例用法,因此很难理解类型规范的含义。在几个地方我已经看到了“一个”在Platform.Cmd作为参数标识,如:Elm docs - “a”是什么意思?
map : (a -> msg) -> Cmd a -> Cmd msg
这是什么意思?我将如何使用Cmd.map
?
Elm docs没有给出任何示例用法,因此很难理解类型规范的含义。在几个地方我已经看到了“一个”在Platform.Cmd作为参数标识,如:Elm docs - “a”是什么意思?
map : (a -> msg) -> Cmd a -> Cmd msg
这是什么意思?我将如何使用Cmd.map
?
a
是类型变量。把它想象成一个的占位符,可以被任何其他类型代替。但是,在一个类型签名中出现的所有a
都必须用相同的具体类型替换。
所以,如果map
有这个签名...
(a -> msg) -> Cmd a -> Cmd msg
...这将是一个有效的替代:
(Bool -> MyMessage) -> Cmd Bool -> Cmd MyMessage
(msg
是另一种类型的变量)
.. 。这将是一个不正确的替代:
(Bool -> MyMessage) -> Cmd MyMessage -> Cmd Bool -- note the mismatched type variables
具有类型变量具有很大的灵活性,因为像map
这样的通用函数可以在各种不同的类型中重复使用。
这里是Elm Guide about reading Types Annotations部分:
> [ "Alice", "Bob" ]
[ "Alice", "Bob" ] : List String
> [ 1.0, 8.6, 42.1 ]
[ 1.0, 8.6, 42.1 ] : List Float
> []
[] : List a
在第一种情况下,我们拥有一个充满字符串值的列表。在 秒中,列表中填充了浮点值。在第三种情况下, 列表是空的,所以我们实际上并不知道列表中的 是什么类型的值。因此,类型列表a说:“我知道我有一个列表,但它可以填充任何东西”。 小写字母a被称为 变量,这意味着在我们的程序中没有任何限制, 将其固定为某种特定类型。换句话说,根据使用方式的不同,类型可以变化 。
在你的情况,作为第一个参数,你应该通过这将需要类型的变量,从第二个参数和返回类型味精值的函数。
我觉得它像Java的泛型,a
是通用原始类型。
例如,在java中,List <String>
是java.util.List
的String
s - 这是List的具体类型。您还可以定义带有签名的方法,如List<A>
,其中A
是原始泛型类型,其中A
由调用方法传入。 Here is the Java explanation of raw types。
同样,在Elm中,01a
是泛型类型的占位符。
你是指“从第二个参数取得类型”是什么意思? – steel
你传递给'Cmd.map'的第二个参数是'Cmd a'的类型,其中'a'可以是任何其他类型。所以这个“一个类型”必须被作为第一个参数传递的函数接受。 – daniula
这对我来说仍然很模糊。你可以添加一个使用示例吗? – steel