F#学習ノート(タイプ)

9391 ワード

scalaとswiftを勉強した後、関数のプログラミングに対する理解が足りないと思って、
本当はハスカルを学びたかったのですが、後からずっとFを学びたいと思っていたので、やはりFを学びましょう.私のメモとしてだけです
F#は複合タイプでscalaとC#より記録と連合が多い
type FullName = {First: string; Last: string;}
type Vehicle = | Car | Truck | Bus
[<EntryPoint>]
let main argv = 
    let a = { First = "Brown" ; Last = "Mike" }
    let b = Car
    0 //         

typeキーワードを使用してtype FullName={First:string;Last:string;}を定義します.これでレコードが定義されます
let b=Carはこれで連合を定義する.
変数を定義するとき、コンパイラはaとbをそれぞれFullNameとVehicleとして暗黙的に推定し、以下のように表示することもできます.
    let a : FullName = { First = "Brown" ; Last = "Mike" }
    let b : Vehicle = Car

F#の結合タイプは非常に柔軟で、それぞれの成分は異なるタイプを取ることができます.
type School = { Name : string; Department: string; }
type Address = 
    | Common of string
    | Street of string * string * int
    | School of School

[<EntryPoint>]
let main argv = 
    let a1 = Street("   ","    ",31)
    let a2 = School({Name = "      "; Department = "   "})
    0 //         

連合は再帰的に定義することもできます.
type Route = 
    | Direct of (string * string)
    | Transfer of (string * Route)

[<EntryPoint>]
let main argv = 
    let r1 = Direct("  ","  ")
    let r2 = Transfer("  ",r1)
    0

可変タイプ
letは可変を表します.関数式は可変を推奨しますが、可変タイプを使用する必要がある場合があります.
    let mutable x = 5
    x <- 6

キーワードmutableを使用して可変変数を表し、<-を使用して値を割り当てます.
デフォルトでは、レコードのフィールドも可変ではありません.
type Score = { mutable Math: int; Phys: int; Chem: int }
[<EntryPoint>]
let main argv = 
    let s = {  Math = 90; Phys = 95; Chem = 80}
    s.Math <- 100 //    
    s.Phys <- 101 //    
    0

参照タイプ
もう1つの変更価値のある方法は、参照タイプを使用することです.数値の前にキーワードrefを追加する方法です.列は次のようになります.
    let y = ref 2.25 //      
    y := !y + 0.2 //     !  ,      :=

可変値と参照値の最大の違いは、可変値には値タイプが格納され、参照値にはポインタが格納されます.
[<EntryPoint>]
let main argv = 
    let mutable x1 = "old value"
    let mutable x2 = x1
    x1 <- "new value"
    printfn "%s" x2

    let y1 = ref "old value"
    let y2 = y1
    y1 := "new value"
    printfn "%s" !y2
    0

x 1は値タイプを格納し、y 1は参照タイプを格納する
オプションのタイプ
    let mutable x = Some(50)
    x <- Some(40)
    x <- None
    printfn "%i" (if x.IsNone then 0 else x.Value)

以上、オプションタイプを定義しました.オプションタイプは整数を取ることも、空の値を取ることもできます.
実際にint optionタイプは、以下の連合タイプ定義に相当します.
type IntOption = 
    | Some of int
    | None