特殊型別變數
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''
然後編譯就好了。
這些沒有官方名稱,有時也稱為:
- 特殊型別變數
- 類型別型別變數
- 偽型別類