2017-03-09 108 views
5

Elm docs没有给出任何示例用法,因此很难理解类型规范的含义。在几个地方我已经看到了“一个”在Platform.Cmd作为参数标识,如:Elm docs - “a”是什么意思?

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

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

回答

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

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 

在第一种情况下,我们拥有一个充满字符串值的列表。在 秒中,列表中填充了浮点值。在第三种情况下, 列表是空的,所以我们实际上并不知道列表中的 是什么类型的值。因此,类型列表a说:“我知道我有一个列表,但它可以填充任何东西”。 小写字母a被称为 变量,这意味着在我们的程序中没有任何限制, 将其固定为某种特定类型。换句话说,根据使用方式的不同,类型可以变化 。

在你的情况,作为第一个参数,你应该通过这将需要类型的变量,从第二个参数和返回类型味精值的函数。

+0

你是指“从第二个参数取得类型”是什么意思? – steel

+0

你传递给'Cmd.map'的第二个参数是'Cmd a'的类型,其中'a'可以是任何其他类型。所以这个“一个类型”必须被作为第一个参数传递的函数接受。 – daniula

+0

这对我来说仍然很模糊。你可以添加一个使用示例吗? – steel

2

我觉得它像Java的泛型,a是通用原始类型。

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

同样,在Elm中,01​​a是泛型类型的占位符。

+0

'原始类型是没有任何类型参数的泛型类或接口的名称“ - 那么原始类型不会是”List“吗? – stholzm

+0

你是对的。我试图从Java原始类型中提取平行于您解释的替代概念,即'place holder'作为我的答案。 – banncee