特殊型別變數
Elm 定義了以下對編譯器具有特定含義的特殊型別變數:
-
comparable:由Int,Float,Char,String和其元組組成。這允許使用<和>運算子。示例: 你可以定義一個函式來查詢列表中的最小和最大元素(
extent)。你認為要寫什麼型別的簽名。一方面,你可以為Float和String寫下extentInt : List Int -> Maybe (Int, Int)和extentChar : List Char -> Maybe (Char, Char)。這些的實施將是相同的:extentInt list = let helper x (minimum, maximum) = ((min minimum x), (max maximum x)) in case list of [] -> Nothing x::xs -> Just <| List.foldr helper (x, x) xs你可能只想簡單地編寫
extent : List a -> Maybe (a, a),但編譯器不允許你這樣做,因為函式min和max沒有為這些型別定義(注意:這些只是圍繞上面提到的<運算子的簡單包裝器)。你可以通過定義extent : List comparable -> Maybe (comparable, comparable)來解決這個問題。這允許你的解決方案是多型的,這意味著它將適用於多種型別。 -
number:由Int和Float組成。允許使用除除法之外的算術運算子。然後,你可以定義例如sum : List number -> number並使其適用於整數和浮點數。 -
appendable:由String,List組成。允許使用++運算子。 -
compappend:這有時會出現,但是是編譯器的實現細節。目前,這不能在你自己的程式中使用,但有時會提到。
請注意,在這樣的型別註釋中:number -> number -> number 這些都引用相同的型別,因此傳入 Int -> Float -> Int 將是型別錯誤。你可以通過在型別變數名稱中新增一個字尾來解決這個問題:number -> number' -> number''然後編譯就好了。
這些沒有官方名稱,有時也稱為:
- 特殊型別變數
- 類型別型別變數
- 偽型別類