Elm文档 - "a"是什么意思?

5
Elm文档没有给出任何使用示例,因此很难理解类型规范的含义。在多个地方,我看到使用"a"作为参数标识符,例如Platform.Cmd
map : (a -> msg) -> Cmd a -> Cmd msg

这是什么意思?我该如何使用 Cmd.map
3个回答

5

以下是 Elm指南 关于读取类型注释的部分:

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

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

> []
[] : List a

在第一种情况下,我们有一个填充了字符串值的列表。在第二种情况下,列表填充了浮点数值。在第三种情况下,列表为空,因此我们实际上不知道列表中有什么类型的值。所以类型 List a 表示“我知道我有一个列表,但它可以被填充任何东西”。小写字母a被称为类型变量,意味着在我们的程序中没有限制将其固定为某个特定类型。换句话说,该类型可以根据使用方式而变化。
在您的情况下,作为第一个参数,您应传递一个函数,该函数将采用第二个参数的变量类型并返回 msg 类型的值。

你是什么意思:“从第二个参数中取类型”? - steel
你传递给 Cmd.map 的第二个参数是类型为 Cmd a 的,其中 a 可以是任何其他类型。因此,作为第一个参数传递的函数必须接受这个 a 类型 - daniula
这对我来说还是有些模糊的。你能加一个用法示例吗? - steel

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

3

我认为它类似于Java泛型,a是通用的原始类型。

例如,在Java中,List <String>java.util.ListString列表 - 这是一个具体的List类型。您还可以定义带有签名的方法,例如List<A>,其中A是原始泛型类型,A由调用方法传入。 这是Java原始类型的解释

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


一个原始类型是一个泛型类或接口的名称,没有任何类型参数 - 原始类型应该是 List 吧? - stholzm
你说得对。我试图从Java原始类型到你解释的替换概念中画出类比,即我的回答中的“占位符”。 - banncee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接