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

时间:2017-03-09 18:49:33

标签: elm

Elm docs没有给出示例用法,因此很难理解类型规范的含义。在一些地方,我看到“a”用作参数标识符,如Platform.Cmd

map : (a -> msg) -> Cmd a -> Cmd msg

这是什么意思?我将如何使用Cmd.map

3 个答案:

答案 0 :(得分:5)

以下是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
  

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

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

答案 1 :(得分:4)

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这样的通用函数可以重复使用各种不同的类型。

答案 2 :(得分:2)

我认为它与Java泛型一样,a是通用原始类型。

例如,在java中,List <String>java.util.List的{​​{1}} - 这是List的具体类型。您还可以使用String之类的签名定义方法,其中List<A>是原始泛型类型,其中A由调用方法传入。 Here is the Java explanation of raw types

同样,在Elm中,A List a是通用类型的占位符。