読者です 読者をやめる 読者になる 読者になる

モノトーンの伝説日記

OBS Studio と Blackmagic Design が大好き。

今日から始める F# “Day 3” 再帰と match 式

 隔日ペースでなくなった今日から始める F# ですー。どうも。

概要

  1. 再帰
  2. match 式
  3. まとめ

1. 再帰

 普通に関数定義すると、うまく動かないです (コンパイルすればわかります)。そこで、rec というキーワードを使います。

 階乗です。オーバーフローして 0 になってて「あれ??? 動かないの???」ってなってしばらく考えてたのは秘密です。

let rec factorial1 x =
    if x = 0 then
        1
    else
        x * factorial1 (x - 1)

 ちなみに再帰は英語で recursive なので rec です。意味的には record ahead (先に記録しておく) といわれてもしっくりきそうですがw

 ただ、再帰だけにしておくのはつまらない。よく皆さんが思い浮かべるのに switch - case があると思うので、そっち方面に行こうと思う。

2. match 式

 F# の switch - case 文といっても差し支えないんじゃないかと。まず、先ほどの再帰関数をそのまま match - with | ~ -> = にしてみよう。

let rec factorial2 x =
    match x with
    | 0 -> 1
    | _ -> x * factorial2 (x - 1)

 C# で書くと、

public int factorial2( int x )
{
  switch( x )
  {
  case 0:
    return 1;
  default:
    return x * factorial2( x - 1 );
  }
}

 みたいな感じになるかと。長い… F# 書いてるとやっぱりえーっと、ってなりながら C# を書いてる。

 でも、負値を入れるとすたっくおーばーふろーになるので、改良しましょう。そのときに when を使ってみます。

let rec factorial3 x =
    match x with
    | 0 -> 1
    | _ when x < 0 -> x * factorial3 (abs(x) - 1)
    | _ -> x * factorial3 (x - 1)

 おお、C# にはできない芸ですね。素晴らしい。C# だと vNext で追加される次の感じに近いかなーと。

try
{
  …
}
catch( Exception ex ) if( ex.Message.Contains( "sample" )
{
  ~
}

 なんていうの、case 0 if みたいな表記もあったらまた広がるのかもねー。

3. まとめ

 今日は階乗をテーマにいろいろな書き方をしてきました。さらっと if 文が出てきたわけですが、簡単だと思います。

 とりあえずチマチマやってますが、まだ書き方になじみがないなぁって感じではある。ほかにもいろいろな機能があってまず一通りブログに書くことでいっぱいいっぱいなので、込み入ったことはまだまだ先になりそう… MSDN の言語リファレンス読んでるだけでも面白そうなモノいっぱいあるんだもの!

 それでは~