2017-03-09 104 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