基本語法

記錄是和代數 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}

為複雜的記錄型別建立鏡頭通常很有用。