Elm文档没有给出任何使用示例,因此很难理解类型规范的含义。在多个地方,我看到使用"a"作为参数标识符,例如Platform.Cmd。
这是什么意思?我该如何使用
map : (a -> msg) -> Cmd a -> Cmd msg
这是什么意思?我该如何使用
Cmd.map
?map : (a -> msg) -> Cmd a -> Cmd msg
Cmd.map
?以下是 Elm指南 关于读取类型注释的部分:
> [ "Alice", "Bob" ]
[ "Alice", "Bob" ] : List String
> [ 1.0, 8.6, 42.1 ]
[ 1.0, 8.6, 42.1 ] : List Float
> []
[] : List a
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
这样的通用函数可以被重复使用于各种不同的类型。我认为它类似于Java泛型,a
是通用的原始类型。
例如,在Java中,List <String>
是java.util.List
的String
列表 - 这是一个具体的List类型。您还可以定义带有签名的方法,例如List<A>
,其中A
是原始泛型类型,A
由调用方法传入。 这是Java原始类型的解释。
同样,在Elm中,List a
中的a
是一个通用类型的占位符。
List
吧? - stholzm
Cmd.map
的第二个参数是类型为Cmd a
的,其中a
可以是任何其他类型。因此,作为第一个参数传递的函数必须接受这个a 类型
。 - daniula