第2羽 関数を愛した言語と鉄道指向に愛された言語


この記事はごちうさ住民 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して実行してみましょう。

$ make
make[1]: Entering directory `/home/kokuyou/repos/ocaml/gochiusa'
ocamldep Main.ml > ._d/Main.d
ocamldep Result.ml > ._d/Result.d
ocamldep Util.ml > ._d/Util.d
make[1]: Leaving directory `/home/kokuyou/repos/ocaml/gochiusa'
make[1]: Entering directory `/home/kokuyou/repos/ocaml/gochiusa'
ocamlc -c Util.ml
ocamlc -c Result.ml
ocamlc -c Main.ml
ocamlc \
                                  \
                                               -o gochiusa \
                                Util.cmo Result.cmo Main.cmo
make[1]: Leaving directory `/home/kokuyou/repos/ocaml/gochiusa'
 
$ ./gochiusa
1
2
あぁ^~
4
心が
あぁ^~
ぴょんぴょんするんじゃぁ^~
8
あぁ^~
心が
11
あぁ^~
13
ぴょんぴょんするんじゃぁ^~
あぁ^~心が
16
17
あぁ^~
19
心が
あぁ^~ぴょんぴょんするんじゃぁ^~
22
23
あぁ^~
心が
26
あぁ^~
ぴょんぴょんするんじゃぁ^~
29
あぁ^~心が
31
32
あぁ^~
34
心がぴょんぴょんするんじゃぁ^~
あぁ^~
37
38
あぁ^~
心が
41
あぁ^~ぴょんぴょんするんじゃぁ^~
43
44
あぁ^~心が
46
47
あぁ^~
ぴょんぴょんするんじゃぁ^~
心が
あぁ^~
52
53
あぁ^~
心が
ぴょんぴょんするんじゃぁ^~
あぁ^~
58
59
あぁ^~心が
61
62
あぁ^~ぴょんぴょんするんじゃぁ^~
64
心が
あぁ^~
67
68
あぁ^~
心がぴょんぴょんするんじゃぁ^~
71
あぁ^~
73
74
あぁ^~心が
76
ぴょんぴょんするんじゃぁ^~
あぁ^~
79
心が
あぁ^~
82
83
あぁ^~ぴょんぴょんするんじゃぁ^~
心が
86
あぁ^~
88
89
あぁ^~心が
ぴょんぴょんするんじゃぁ^~
92
あぁ^~
94
心が
あぁ^~
97
ぴょんぴょんするんじゃぁ^~
あぁ^~
心が
101
あぁ^~
103
104
あぁ^~心がぴょんぴょんするんじゃぁ^~

実に心がぴょんぴょんしますね!!!
このソースコードはGithubのリポジトリに置いてあるので、どこでも(GitとOCamlさえインストールされていれば)心ぴょんぴょんできちゃいます。

$ git clone git@github.com:kokuyouwind/gochiusa-railway.git
$ cd gochiusa-railway
$ make
$ ./gochiusa

ちなみに、このFizzBuzzごちうさ改変ネタは簡約 λカ娘 巻の七@tanakhさんが書かれた記事「ご注文は依存型ですか?」のパク…リスペクトです。
@tanakhさんもごちうさアドベントカレンダー参加者なのでどんな記事を書かれるのか楽しみですね!

それでは素敵なごちうさライフを!
ぴょんぴょん!

※鉄道指向の説明は(めんどくさくなったことは…わわわ!)内緒なの


1 Comment

  1. Monad っぽいなーと思っていたら、オリジナルで Either monad だって書かれてました
    Railway-Oriented-Programming-Example

    ただ鉄道の図は見た目にキレイだったので、物理的なアナロジーもいいですね

コメントを残す

Your email address will not be published.