osiire’s blog

ふしぎなそふとやさん

maybeモナドはDB読み込みにちょうどよい気がする

思い切ってpa_monadを実プロジェクトに初めて投入してみた。特に今回はDB周りの処理が多かったので、maybeモナドが大活躍。

module MaybeM = struct
  let bind m f =
    match m with
      None -> None
    | Some v -> f v
  let return v =
    Some v
end

データベースからselect文でデータを取ってこようとすると、列の値がoptionになる(nullの可能性もあるから)ので、本来はパターンマッチしてSomeの中身を取り出さなきゃならない。でもmaybeモナドならそんな事殆ど気にしなくてよくなる。次のコードは実際に使ったコードの一部。

  select original_db (* select文実行 *)
    "select distinct maker_code, syasyu_code, syasyu, syasyu_index from mks order by maker_code,syasyu_code"
    (fun row -> (* ここに一行分のデータがくる *)
       perform begin (* ← pa_monadの特殊構文 *)
         maker_code <-- row ~key:"maker_code"; (*すごく素直に変数へバインディングできる。嬉しい *)
         models_code_org <-- row ~key:"syasyu_code";
         name <-- row ~key:"syasyu";
         group <-- row ~key:"syasyu_index";
         let code =
           int_of_string (sprintf "1%03d%03d" 
                            (int2ml maker_code) 
                            (int2ml models_code_org)) 
         in
         return (code, (* 最後はリターンで成功を主張 *)
               int2ml maker_code, 
               int2ml models_code_org, 
               str2ml name,
               convert_groups (str2ml group))
       end)

ま、Haskell使いには何を今更って話ですが、OCamlでもモナド推奨!ってことで。