fun-girlz


Rekordy

Aby modelować dane złożone z pól (np. dane z bazy danych) zamiast posługiwać się krotkami to użyjemy rekordów. Rekordy aby były funkcyjną strukturą danych są niemutowalne.

Na początku musimy zdefiniować typ rekordu:

1: 
2: 
3: 
4: 
5: 
6: 
7: 
type SkinColor = Caucasian | Asian | Black

type Person = {
    Name : string;
    Age  : int;
    Skin : SkinColor;
}

Aby utworzyć wartość tego typu posłużymy się bardzo podobną składnią, ale do przypisania wartości pól użyjemy =.

1: 
let jim = { Name = "Jim"; Age = 1; Skin = Caucasian }

Aby dokonywać modyfikacji stanu, będziemy tworzyli funkcje, które przyjmują rekord i zwracają nowy zaktualizowany.

1: 
2: 
let makeOlder p = { p with Age = p.Age + 1 }
let jim' = makeOlder jim

Powyżej widzimy składnię aktualizacji rekordów oraz składnię odwołania się do konkretnego pola.

Zadanie

Opracuj obiekt Random, który będzie zawierał stan (stałe oraz seed) służący do generowania kolejnej liczby pseudolosowej. Do tego napisz funkcję newRandom, która przyjmuje wartość początkową seeda, oraz funkcję nextRandom o sygnaturze Random -> Random * int. Przetestuj działanie generatora liczb pseudolosowych tworząc funkcję randomArray, która przyjmuje początkowy seed i liczbę elementów do wygenerowania.

Pytania? Jeśli wszystko jasne, to przechodzimy do następnego modułu

type SkinColor =
  | Caucasian
  | Asian
  | Black

Full name: Rec.SkinColor
union case SkinColor.Caucasian: SkinColor
union case SkinColor.Asian: SkinColor
union case SkinColor.Black: SkinColor
type Person =
  {Name: string;
   Age: int;
   Skin: SkinColor;}

Full name: Rec.Person
Person.Name: string
Multiple items
val string : value:'T -> string

Full name: Microsoft.FSharp.Core.Operators.string

--------------------
type string = System.String

Full name: Microsoft.FSharp.Core.string
Person.Age: int
Multiple items
val int : value:'T -> int (requires member op_Explicit)

Full name: Microsoft.FSharp.Core.Operators.int

--------------------
type int = int32

Full name: Microsoft.FSharp.Core.int

--------------------
type int<'Measure> = int

Full name: Microsoft.FSharp.Core.int<_>
Person.Skin: SkinColor
val jim : Person

Full name: Rec.jim
val makeOlder : p:Person -> Person

Full name: Rec.makeOlder
val p : Person
val jim' : Person

Full name: Rec.jim'
F# Project