2013年4月13日土曜日

ScalaでChurch encoding

data Maybe a = Nothing | Just a
という型をekmettさんのコードを参考にChurch encodingしてみると、

newtype Maybe { runMaybe :: forall r. a -> r -> r -> r }

となります。(多分)

これをScalaで表現してみました。

とても面倒なことになってますが、ちゃんとMaybeモナドとして動作します。
Haskellだと結構綺麗に書けたりします。

Church encodingすると大抵の場合に高速化されます。
このMaybeモナドの例では、emptyをbindで合成した時に、Justの場合の処理を破棄しています。

ラムダ計算で代数的データ型を表現する方法

この記事も面白いのでぜひ読んでみて下さい。

2013年2月7日木曜日

Destructuringを使おう

Clojureで積極的にDestructuringを使っていこうという話です。

ListやVectorに対する再帰


例: index-of


Destructuringを使うとこんな感じで書ける。


firstとrestがなくなりました。

例: end


Destructuringは関数の引数部に直接書ける。


リスト全体を束縛する変数を省略出来ました。

MapやRecordに対するDestructuring


レコードに対する操作


例: abs


Destructuringを使うとこんな感じ。


{:keys [foo bar ...]}はフィールドを列挙することでその値を束縛します。

例: add


フィールドと違った名前の変数名を付ける場合は{foo' :foo bar' :bar ...}という記法が使えます。


Destructuringを使うことで要素の取得、束縛を簡素にしませんか?

2013年2月2日土曜日

Clojureで継承みたいなナニカ

Clojureのdeftypeやdefrecordではinterfaceのみを実装することができます。
しかし、継承のように実装があるclassを継承したいときがあります。

例えばこんなコードがあります。


ConsとNilのaddとemptyの実装が同じです。
共通化したい。

とりあえず、addとemptyを別Protocolに。


ListというProtocolを作って、それに対するAdderを定義します。


ConsとNilに対してListを実装すれば、めでたしめでたし。


2013年1月29日火曜日

ClojureのKeywordはLensなのですy

春休みヤッター!
ブログの更新頻度も上げていくつもりです。

Lens


Lensはあるフィールドに対するgetterとsetterを持つ。
コードにするとこんな感じ。



見てわかるとおり、lgetはgetで、lsetはassocで十分なのだ。


Lensの特徴


getとsetがあればmodifyが定義できる。



Clojureにはupdate-inがある。


Lensは合成が可能だ。



Clojureの{get, assoc, update}-in関数は複数のKeywordをとることで、ネストしたレコードに対しても有効です。


LensはStateモナドと組み合わせると素敵です。
更新途中の状態を取得することは出来ないけれど、Clojureにはアローマクロが存在します。



KeywordがLensだということを意識すれば、Lensの考え方を応用することが出来ますね。