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)