F#学習ノート(タイプ)
9391 ワード
scalaとswiftを勉強した後、関数のプログラミングに対する理解が足りないと思って、
本当はハスカルを学びたかったのですが、後からずっとFを学びたいと思っていたので、やはりFを学びましょう.私のメモとしてだけです
F#は複合タイプでscalaとC#より記録と連合が多い
typeキーワードを使用してtype FullName={First:string;Last:string;}を定義します.これでレコードが定義されます
let b=Carはこれで連合を定義する.
変数を定義するとき、コンパイラはaとbをそれぞれFullNameとVehicleとして暗黙的に推定し、以下のように表示することもできます.
F#の結合タイプは非常に柔軟で、それぞれの成分は異なるタイプを取ることができます.
連合は再帰的に定義することもできます.
可変タイプ
letは可変を表します.関数式は可変を推奨しますが、可変タイプを使用する必要がある場合があります.
キーワードmutableを使用して可変変数を表し、<-を使用して値を割り当てます.
デフォルトでは、レコードのフィールドも可変ではありません.
参照タイプ
もう1つの変更価値のある方法は、参照タイプを使用することです.数値の前にキーワードrefを追加する方法です.列は次のようになります.
可変値と参照値の最大の違いは、可変値には値タイプが格納され、参照値にはポインタが格納されます.
x 1は値タイプを格納し、y 1は参照タイプを格納する
オプションのタイプ
以上、オプションタイプを定義しました.オプションタイプは整数を取ることも、空の値を取ることもできます.
実際にint optionタイプは、以下の連合タイプ定義に相当します.
本当はハスカルを学びたかったのですが、後からずっと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