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の場合の処理を破棄しています。
ラムダ計算で代数的データ型を表現する方法
この記事も面白いのでぜひ読んでみて下さい。