LoginSignup
0
1

More than 5 years have passed since last update.

F#について

Last updated at Posted at 2016-12-11

始めに

関数型言語の実装に慣れるため、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型として推論されているように見えるけれど、そうなる理由がいまいちわからない
0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1