鉄道指向でこころがぴょんぴょんする解説

前回鉄道指向でこころぴょんぴょんする記事を書いたところ、会社の同僚から「鉄道指向ってなんだい? わけがわからないよ。あと、この記事はどの辺がごちうさに関係あるんだい?」というありがたいコメントを頂きました。
そんなわけで、今回は前回書いたプログラムについて、鉄道指向と絡めて解説したいと思います。
なお、鉄道指向について詳しく知りたい場合は鉄道指向プログラミングの翻訳記事を読んでいただいたほうがわかりやすいかと思います。

さて、ざっくり鉄道指向について説明すると、「成功(Success)と失敗(Failure)の2種類の値を返すような関数を鉄道のスイッチに見立てて、この関数を組み合わせて広大な路線=プログラムを組み立てていく」というプログラミングスタイルです。
例えば何らかのWebアプリケーションを、以下のようなブラックボックスと考えてみましょう。

Request-Response

ApplicationからSuccessとFailureの2本の矢印が伸びていますが、これはSuccessとFailureの両方を返すわけではなく、状況に応じていずれか一方を返すという意味です。
鉄道の路線と同様、通るのはどちらか一方だけ、ということですね。
またSuccessとFailureはどちらの路線かという情報とは別に、更に詳細な情報を持つことが出来ます。
上を通る列車が、詳細な情報を荷物として載せているイメージです。

このような「SuccessとFailureのいずれかを返す型response」は、OCamlでは代数的データ型を用いて以下のように書くことが出来ます。

type ('a, 'b) response = Success of 'a | Failure of 'b

‘aがSuccessの時に保持している詳細情報の型を、’bがFailureの時に保持している詳細情報の型を、それぞれ表しています。
例えば成功した時に数値を、失敗した時に文字列を詳細情報として持つような型は

(int,string) response

という型になります。
Success(1)やFailure(“入力した数値が不正です”)などは(int,string) response型の値です。

Continue reading

第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' =  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

会社のLTでOCaml/Ocsigenについて発表しました

うちの会社は割といろんな言語を使っているエンジニアがいるのですが、OCamlerは少なそうだったのでOCamlを布教するべく、OCamlでWebサービスが作れるOcsigenの紹介LTをしてきました。

簡単にOcsigenを題材に選んだ流れをまとめると、
 先週月曜(2014/07/07)に全社ハッカソンがあった
→せっかくなのでOcsigenでなんか作りたかった
→チュートリアルの途中で力尽きた
→社内LTの発表順が翌週だったので、土日使ってチュートリアルを最後まで終わらせてネタにすることにした
というような感じでした。

本当はチュートリアルで終わらずにアプリを作りたかったのですが、思いのほか環境構築のほうに手間取ったためにたどり着けませんでした…
まぁ思いのほかOcsigenのモジュール構成が複雑だったので、ある程度習熟しないと一朝一夕でなんか作るのはしんどそうでしたが。

Continue reading

OCamlでBefungeインタプリタを実装してみた

なぜかふと思い立って、BefungeのインタプリタをOCamlで実装してしまいました。
Befungeってどんな言語? というと、↓がHello,worldのソースファイルになるような言語です。
ちなみにこのソースはWikipediaのものをそのままお借りしています。

v @_       v
>0"!dlroW"v 
v  :#     <
>" ,olleH" v
   ^       <

WP-Codeboxでハイライトされない……
まぁ、さすがにこんなところまでサポートしてないですよね。
Brainfu*kはあるみたいですが。

Continue reading

OCamlでカウンターモジュール

副作用はなるべくないほうがよい。
それはそうなんですが、副作用を使ったほうが効率がよかったり、コードの見通しが良くなったりすることもよくある話です。
例えば、以下のような単純な表示関数printを考えます。

let print s =
  Format.printf "%s@." s

当然ながら、呼び出すと以下のように引数の文字列をそのまま表示します。

# print "a";;
a
- : unit = ()
# print "b";;
b
- : unit = ()
# print "c";;
c
Continue reading

OCaml標準ライブラリの拡張

OCamlで使える標準ライブラリは、最初に触れた時こそ「すげー、集合とか標準で使えるの!?」とか思ってたものの、実際触っていると「あれ? Setってof_listないの?」とか「え? リストのconsって関数として用意されてないの?」とか「うわっ……私の年収、低すぎ……?」など、いろいろな不満が出てきます。最後のは関係ありませんが。

調べてみたところ、あれは標準ライブラリではなくすとっどりぶなのですね……
それならしょうがない。
普通ならCoreとかBatteriesとか入れるんでしょうが、変な依存性入れたくないですし、これまで組んだプログラムを修正するのも面倒なので、勉強も兼ねて自分で互換性持たせたまま拡張してみることにしました。
先日、OCamlでモナドっぽいものを作ったという記事を書きましたが、それも拡張の一貫ですね。
というわけで、覚え書きも兼ねて、詰まった部分などをまとめておきます。

Continue reading

Haskellの資料まとめ

モナドを勉強するに辺り、やはり進んでいるのはHaskellらしく、調べてるだけでHaskellに関する情報がぼろぼろ出てきたのでその辺をご紹介。

まず、「モナドのすべて」さん。
モナドの基礎についてかなり詳しく書かれています。
Haskellについて知らなくてもなんとなくはわかったので、特にOptionモナドやListモナドを実装する上で参考にさせて頂きました。

Continue reading
Older posts Newer posts