ひなたねこ
自由気ままにプログラミングについて記録していくBlogです。
2013年5月12日日曜日
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の場合の処理を破棄しています。
ラムダ計算で代数的データ型を表現する方法
この記事も面白いのでぜひ読んでみて下さい。
という型をekmettさんのコードを参考にChurch encodingしてみると、
newtype Maybe { runMaybe :: forall r. a -> r -> r -> r }
となります。(多分)
これをScalaで表現してみました。
とても面倒なことになってますが、ちゃんとMaybeモナドとして動作します。
Haskellだと結構綺麗に書けたりします。
Church encodingすると大抵の場合に高速化されます。
このMaybeモナドの例では、emptyをbindで合成した時に、Justの場合の処理を破棄しています。
ラムダ計算で代数的データ型を表現する方法
この記事も面白いのでぜひ読んでみて下さい。
2013年3月1日金曜日
2013年2月7日木曜日
Destructuringを使おう
Clojureで積極的にDestructuringを使っていこうという話です。
例: index-of
Destructuringを使うとこんな感じで書ける。
firstとrestがなくなりました。
例: end
Destructuringは関数の引数部に直接書ける。
リスト全体を束縛する変数を省略出来ました。
レコードに対する操作
例: abs
Destructuringを使うとこんな感じ。
{:keys [foo bar ...]}はフィールドを列挙することでその値を束縛します。
例: add
フィールドと違った名前の変数名を付ける場合は{foo' :foo bar' :bar ...}という記法が使えます。
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を実装すれば、めでたしめでたし。
しかし、継承のように実装があるclassを継承したいときがあります。
例えばこんなコードがあります。
ConsとNilのaddとemptyの実装が同じです。
共通化したい。
とりあえず、addとemptyを別Protocolに。
ListというProtocolを作って、それに対するAdderを定義します。
ConsとNilに対してListを実装すれば、めでたしめでたし。
2013年1月29日火曜日
ClojureのKeywordはLensなのですy
春休みヤッター!
ブログの更新頻度も上げていくつもりです。
Lensはあるフィールドに対するgetterとsetterを持つ。
コードにするとこんな感じ。
見てわかるとおり、lgetはgetで、lsetはassocで十分なのだ。
getとsetがあればmodifyが定義できる。
Clojureにはupdate-inがある。
Lensは合成が可能だ。
Clojureの{get, assoc, update}-in関数は複数のKeywordをとることで、ネストしたレコードに対しても有効です。
LensはStateモナドと組み合わせると素敵です。
更新途中の状態を取得することは出来ないけれど、Clojureにはアローマクロが存在します。
KeywordがLensだということを意識すれば、Lensの考え方を応用することが出来ますね。
ブログの更新頻度も上げていくつもりです。
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の考え方を応用することが出来ますね。
2012年12月21日金曜日
Konst
この記事はScalaz Advent Calendarの20日目の記事です。
ScalaにはFunction.constという常に一定の値を返す関数があります。
この関数を型レベルで表したものがScalazにKonstとして定義されています。
NaturalTransformationを例にKonstを使ってみます。
あまり使わなさそうですね!
私としてはまだScalaz6にあったPartialApplyの方が便利な気がするのですが。
まあ、型推論がうまくいかなかったり、Unapplyが新しく入ったりしたことが原因にあるのでしょうね。
ScalaにはFunction.constという常に一定の値を返す関数があります。
この関数を型レベルで表したものがScalazにKonstとして定義されています。
Konst
NaturalTransformationを例にKonstを使ってみます。
あまり使わなさそうですね!
私としてはまだScalaz6にあったPartialApplyの方が便利な気がするのですが。
まあ、型推論がうまくいかなかったり、Unapplyが新しく入ったりしたことが原因にあるのでしょうね。
登録:
投稿 (Atom)