日誌
記錄是一組鍵值對。
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"
}