日誌

記錄是一組鍵值對。

greeter =
    { isMorning: True
    , greeting: "Good morning!"
    }

通過不存在的金鑰訪問值是不可能的。

動態修改 Record 的結構是不可能的。

記錄僅允許你通過常量鍵更新值。

訪問值

使用動態金鑰無法訪問值以防止可能的執行時錯誤:

isMorningKeyName =
    "isMorning "

greeter[isMorningKeyName] -- Compiler error
greeter.isMorning -- True

訪問該值的替代語法允許你在通過 Record 記錄時提取值:

greeter
    |> .greeting
    |> (++) " Have a nice day!" -- "Good morning! Have a nice day!"

擴充套件型別

有時你需要引數的簽名來約束傳遞給函式的記錄型別。擴充套件記錄型別使得超型別的概念變得不必要。以下示例顯示瞭如何實現此概念:

type alias Person =
    { name : String
    }

type alias Animal =
    { name : String
    }

peter : Person
peter =
    { name = "Peter" }

dog : Animal
dog =
    { name = "Dog" }

getName : { a | name : String } -> String
getName livingThing =
    livingThing.name

bothNames : String
bothNames =
    getName peter ++ " " ++ getName dog

我們甚至可以進一步擴充套件記錄並執行以下操作:

type alias Named a = { a | name : String }
type alias Totalled a = { a | total : Int }

totallyNamed : Named ( Totalled { age : Int })
totallyNamed =
  { name = "Peter Pan"
  , total = 1337
  , age = 14
  }

我們現在有辦法在函式中傳遞這些部分型別:

changeName : Named a -> String -> Named a
changeName a newName =
  { a | name = newName }
  
cptHook = changeName totallyNamed "Cpt. Hook" |> Debug.log "who?"

更新值

Elm 有一個特殊的 Record 更新語法:

model =
    { id: 1
    , score: 0
    , name: "John Doe"
    }

update model =
    { model
       | score = model.score + 100
       | name = "John Johnson"
    }