基本語法
記錄是和代數 data
型別的擴充套件,允許欄位命名:
data StandardType = StandardType String Int Bool --standard way to create a sum type
data RecordType = RecordType { -- the same sum type with record syntax
aString::String
, aNumber::Int
, isTrue :: Bool
}
然後可以使用欄位名稱從記錄中獲取指定的欄位
> let r = RecordType {aString = "Foobar", aNumber= 42, isTrue = True}
> :t r
r::RecordType
> :t aString
aString::RecordType -> String
> aString r
"Foobar"
記錄可以與模式匹配
case r of
RecordType{aNumber = x, aString=str} -> ... -- x = 42, str = "Foobar"
請注意,並非所有欄位都需要命名
記錄是通過命名它們的欄位來建立的,但也可以建立為普通的總和型別(當欄位數很小且不太可能改變時通常很有用)
r = RecordType {aString = "Foobar", aNumber= 42, isTrue = True}
r' = RecordType "Foobar" 42 True
如果建立的記錄沒有命名欄位,編譯器將發出警告,結果值將為 undefined
。
> let r = RecordType {aString = "Foobar", aNumber= 42}
<interactive>:1:9: Warning:
Fields of RecordType not initialized: isTrue
> isTrue r
Error 'undefined'
可以通過設定其值來更新記錄的欄位。未提及的欄位不會更改。
> let r = RecordType {aString = "Foobar", aNumber= 42, isTrue = True}
> let r' = r{aNumber=117}
-- r'{aString = "Foobar", aNumber= 117, isTrue = True}
為複雜的記錄型別建立鏡頭通常很有用。