この記事はごちうさ住民 Advent Calendar 2014の2日目です。
あとタイトルは内容にあんまり関係ありません。

みなさん、心ぴょんぴょんしてますか?
今日は、鉄道指向を使って心ぴょんぴょんしてみたいと思います。

まずは、鉄道指向プログラミングの翻訳記事を参考に、鉄道指向で用いるResultモジュールを定義します。

type ('a, 'b) t = Success of 'a | Failure of 'b
let succeed x = Success x
let fail x = Failure x
let either successFunc failureFunc = function
  | Success s -> successFunc s
  | Failure f -> failureFunc f
let plus addS addF f1 f2 r = match f1 r, f2 r with
  | Success s1, Success s2 -> succeed @@ addS s1 s2
  | Failure f1, Success _  -> fail f1
  | Success _ , Failure f2 -> fail f2
  | Failure f1, Failure f2 -> fail @@ addF f1 f2

続いて、こころぴょんぴょんする関数を定義していきましょう。

let failOnMod n' msg n = if n mod n' = 0 then Failure msg else Success n
let aa     = failOnMod 3 "あぁ^~"
let kokoro = failOnMod 5 "心が"
let pyon   = failOnMod 7 "ぴょんぴょんするんじゃぁ^~"
let (&&&) = plus const (^)
let gochiusa = aa &&& kokoro &&& pyon >> either string_of_int id
 
let () = List.iter (gochiusa >> Printf.printf "%s\n") (1--105)

一部定義をすっ飛ばした関数がありますが、些細なことなのでUtil.mlのソースを見て下さいね。
では、さっくりMakeして実行してみましょう。

Continue reading