特殊型別變數

Elm 定義了以下對編譯器具有特定含義的特殊型別變數:

  • comparable :由 IntFloatCharString 和其元組組成。這允許使用 <> 運算子。

    示例: 你可以定義一個函式來查詢列表中的最小和最大元素(extent)。你認為要寫什麼型別的簽名。一方面,你可以為 FloatString 寫下 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),但編譯器不允許你這樣做,因為函式 minmax 沒有為這些型別定義(注意:這些只是圍繞上面提到的 < 運算子的簡單包裝器)。你可以通過定義 extent : List comparable -> Maybe (comparable, comparable) 來解決這個問題。這允許你的解決方案是多型的,這意味著它將適用於多種型別。

  • number :由 IntFloat 組成。允許使用除除法之外的算術運算子。然後,你可以定義例如 sum : List number -> number 並使其適用於整數和浮點數。

  • appendable :由 StringList 組成。允許使用++運算子。

  • compappend :這有時會出現,但是是編譯器的實現細節。目前,這不能在你自己的程式中使用,但有時會提到。

請注意,在這樣的型別註釋中:number -> number -> number 這些都引用相同的型別,因此傳入 Int -> Float -> Int 將是型別錯誤。你可以通過在型別變數名稱中新增一個字尾來解決這個問題:number -> number' -> number''然後編譯就好了。

這些沒有官方名稱,有時也稱為:

  • 特殊型別變數
  • 類型別型別變數
  • 偽型別類

這是因為它們像 Haskell 的型別類一樣工作,但沒有使用者定義這些的能力。