Elm docs沒有給出任何示例用法,因此很難理解類型規範的含義。在幾個地方我已經看到了「一個」在Platform.Cmd作爲參數標識,如:Elm docs - 「a」是什麼意思?
map : (a -> msg) -> Cmd a -> Cmd msg
這是什麼意思?我將如何使用Cmd.map
?
Elm docs沒有給出任何示例用法,因此很難理解類型規範的含義。在幾個地方我已經看到了「一個」在Platform.Cmd作爲參數標識,如:Elm docs - 「a」是什麼意思?
map : (a -> msg) -> Cmd a -> Cmd msg
這是什麼意思?我將如何使用Cmd.map
?
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
這樣的通用函數可以在各種不同的類型中重複使用。
這裏是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被稱爲 變量,這意味着在我們的程序中沒有任何限制, 將其固定爲某種特定類型。換句話說,根據使用方式的不同,類型可以變化 。
在你的情況,作爲第一個參數,你應該通過這將需要類型的變量,從第二個參數和返回類型味精值的函數。
我覺得它像Java的泛型,a
是通用原始類型。
例如,在java中,List <String>
是java.util.List
的String
s - 這是List的具體類型。您還可以定義帶有簽名的方法,如List<A>
,其中A
是原始泛型類型,其中A
由調用方法傳入。 Here is the Java explanation of raw types。
同樣,在Elm中,01a
是泛型類型的佔位符。
你是指「從第二個參數取得類型」是什麼意思? – steel
你傳遞給'Cmd.map'的第二個參數是'Cmd a'的類型,其中'a'可以是任何其他類型。所以這個「一個類型」必須被作爲第一個參數傳遞的函數接受。 – daniula
這對我來說仍然很模糊。你可以添加一個使用示例嗎? – steel