F#のアクティブパターンがふつくしすぎる。あらまほしき言語なり。
最近、C#ほったらかしてF#でいろいろやってます。F#にお熱です。
OCamlらくだ本を読み返しつつ、いげ太さんのブログやdeko_ponさんのF#入門などで勉強しています。
というわけで、また息抜きに当ブログ恒例の「世界のナベアツ問題」(風化問題ってレベルじゃねーぞ)を、
俄仕込みではありますが、アクティブパターンを使って書いてみました。
#light open System (* b / a が割り切れるときにその商を返すアクティブパターン *) let (|M|_|) a b = if b % a = 0 then Some (b / a) else None (* string b に char aが含まれている場合 b を返すアクティブパターン *) let (|E|_|) a b = if String.exists (fun c -> if c = (a |> string |> char) then true else false) (b |> string) then Some b else None let nabeatsu (seq : seq<int>) = let nabeatsu' i = let s = i |> string match i with | M 8 _ & (M 3 _ | E 3 _) -> s + "あほあはん" | E 3 _ -> s + "あほ" | M 3 _ -> s + "あほ" | M 8 _ -> s + "あはん" | _ -> s in Seq.map nabeatsu' seq {1..40} |> nabeatsu |> Seq.iter (printf "%s\r\n") Console.ReadKey(true)
これってつまり、HaskellのMaybeモナド的なアレですよね。アクティブパターン・・・ふつくしすぎる(初心者なりに)。
F#は、標準的なオブジェクト指向言語開発者(特にC#使い)にとっては、とっつきやすい関数型言語ですね。
.NET畑の人間にとっては、今まで培ってきた.NET Framework関連の知識や財産がそのまま活かせるところが大きい希ガス。
※C#で書いたネタはこちら→FizzBuzz問題と世界のナベアツ
※Haskellで書いたネタはこちら→Haskellで世界のナベアツ問題
※PowerShellで書いたネタはこちら→PowerShellで世界のナベアツ問題