始めに
関数型言語の実装に慣れるため、F#の基本的な文法のコードを書いてみました
サンプルコード
//型の定義
type Person = {
Name: string
Age: int
}
//型の具象化
let a = { Name = "hoge"; Age = 24 }
let b = { Name = "hoge"; Age = 24 }
//if文
if a = b then
System.Console.WriteLine(a)
System.Console.WriteLine(a.Age)
else
printfn "Oops..."
let c = { Name = "TRIPLE"; Age = 25 }
if a = c then
System.Console.WriteLine(a)
System.Console.WriteLine(a.Age)
// printfn a.Name --(A)
else
printfn "Oops..."
//関数の定義
let my_function num = num + 1
System.Console.WriteLine(my_function 1) //2が表示される
//パターンマッチ
let my_type_check target=
match target with
| "TRIPLE" -> System.Console.WriteLine( "ブログ主")
| "READER" -> System.Console.WriteLine("読者" )
| _ -> System.Console.WriteLine( "他人")
in
my_type_check c.Name //ブログ主が表示される
my_type_check a.Name //他人が表示される
//再帰呼び出し
let rec saiki target=
match target with
| 0 -> 0
| _ -> saiki(target-1) + 1
System.Console.WriteLine(saiki 5) //5が表示される
let rec saiki2 target=
match target with
| 0 -> 0
| _ -> target+saiki(target-1)
System.Console.WriteLine(saiki2 5) //9が表示される --(B)
let rec saiki3 target=
if(target <= 0) then 0 //--(C)
else target+saiki3(target - 1)ーー(C')
System.Console.WriteLine(saiki3 5) //15が表示される //--(D)
メモ
- 再帰関数として定義したい場合はrecをつける
疑問点
- (A)でコンパイルエラーが出る理由がわからない
- (B)と(D)で結果が違う理由がわからない
- (C)でtarget == 0と記述すると、(C')でコンパイルエラーが発生する。どうやら、targetがbool型として推論されているように見えるけれど、そうなる理由がいまいちわからない