data Hefty h a = Pure a | forall x . h (Hefty h) x :>>= (x -> Hefty h a)
というデータ型が肝なんだろうな。これにOpenUnionをくっつければ基本的なところはできるんじゃないかな。
あとは安全性のために「できる操作」を型で制限してやる感じかな。
ここで h :: (Type -> Type) -> Type -> Type
Please Login to reply.
基本的なところを書くだけなら、それほど難しくもないのかな。腰をすえてやってみようかな。名前はYaftyとかかな。
data HFreer h a = Pure a | forall x . h (HFreer h) x :>>= (x -> HFreer h a)