ようこそ。睡眠不足なプログラマのチラ裏です。

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で世界のナベアツ問題