generated at
objective
> オブジェクトは自然変換とミーリ・マシン両方の性質を併せ持つ♠  ― fumieval
Haskellでメッセージパッシングによるオブジェクト指向を実現するためのライブラリ。

haskell
newtype Object f g = Object { runObject :: forall x. f x -> g (x, Object f g) }

Object f g は、 f x 型のメッセージを受け取り、モナド g 上で処理して結果 x と状態を更新したオブジェクトを返す。ストリーミングライブラリが値に対する変換器なら、こちらはアクションに対する変換器と捉えられる。

Object as a Morphism - A Composable Structure Parameterized by Effects という論文が執筆されたがHaskell Symposium 2015には採択されなかった。しかし、いくつかの斬新なアイデアが生まれたのは間違いない。

オブジェクトの合成: 縦と横

オブジェクトがメッセージを解釈する際に発生する作用を、また別のオブジェクトに解釈させるという合成が考えられる。これが縦の合成である。

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の第三の合成、時の合成だ。

haskell
newtype 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はこの研究から派生して生まれた。