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