objective
> オブジェクトは自然変換とミーリ・マシン両方の性質を併せ持つ♠ ― fumieval
Haskellでメッセージパッシングによる
オブジェクト指向を実現するためのライブラリ。
haskellnewtype Object f g = Object { runObject :: forall x. f x -> g (x, Object f g) }
Object f g
は、
f x
型のメッセージを受け取り、
モナド g
上で処理して結果
x
と状態を更新したオブジェクトを返す。
ストリーミングライブラリが値に対する変換器なら、こちらはアクションに対する変換器と捉えられる。
オブジェクトの合成: 縦と横
オブジェクトがメッセージを解釈する際に発生する作用を、また別のオブジェクトに解釈させるという合成が考えられる。これが縦の合成である。
haskell(@>>@) :: Functor h => Object f g -> Object g h -> Object f h
あるいは、二つのオブジェクトを貼り合わせ、メッセージの直和を解釈するオブジェクトを作れる。これは横の合成と呼ぶ。
haskell(@||@) :: Functor h => Object f h -> Object g h -> Object (f `Sum` g) h
定命のオブジェクト
従来はオブジェクトに死という概念はなく、インスタンスへの参照の消滅を以てGCされる程度だったが、オブジェクトを MaybeT
のようなモナドにすることで自発的に死亡するオブジェクトも表現できる。さらにExceptTを使えばダイイングメッセージを残すことができ、その遺志を継いで新たなオブジェクトへつなげるようなモナドが定義できる。これがobjectiveの第三の合成、時の合成だ。
haskellnewtype Mortal f g a = Mortal { unMortal :: Object f (ExceptT a g) }
apprises :: (Witherable t, Monad m, Applicative m, Monoid r)
=> f a
-> (a -> r)
-> (b -> r)
-> StateT (t (Mortal f m b)) m r
ゲームプログラミングにおけるエンティティの管理のような、コンテナ全体にメッセージを送る使い方と相性が良い。
witherableはこの研究から派生して生まれた。