A record is a tuple with named fields. In complex programs, having names for items is helpful. It helps us understand what a program is doing.
With simple syntax, we create records by labeling field names and types. A record is created automatically based on the fields we specify. We can copy records while changing these fields.
Let us begin with this example. We use the type keyword to create a record type. We specify Name, Weight and Wings on the record. These are of types string
, int
and bool
.
type Animal = { Name:string; Weight:int; Wings:bool } // Create an instance of Animal named cat. let cat = { Name="cat"; Weight=12; Wings=false } // Display the cat record. printfn "%A" cat // Display the Name, Weight and Wings properties. printfn "%A" cat.Name printfn "%A" cat.Weight printfn "%A" cat.Wings // Modify an existing record. // ... Set name to "dog." let dog = { cat with Name="dog" } printfn "%A" dog let bird = { cat with Name="bird"; Wings=true } printfn "%A" bird{Name = "cat"; Weight = 12; Wings = false;} "cat" 12 false {Name = "dog"; Weight = 12; Wings = false;} {Name = "bird"; Weight = 12; Wings = true;}
Fields in a record cannot be assigned. The F# compiler will report an error saying "This field is not mutable." We must use "with" to copy records, changing values in that way.
type ExampleRecord = { size:int; valid:bool } let example = { size=10; valid=true } // This causes an error: cannot be compiled. example.size <- 20error FS0005: This field is not mutable
Records have features of classes, like named fields, but are more similar to tuples. Their fields are immutable. And they provide special syntax for modification during copying.