wasabi
fused-effects
を用いて`callCC`をサポートするEffectを作ろうとしているのですが実装がうまく行きません. どうすれば実装できるか知りたいです. 質問の詳細はスレッドに
続きます.
fused-effects
を用いて`callCC`をサポートするEffectを作ろうとしているのですがmtl
の Cont
は、戻り値型rを加えた Cont r
がモナドになりますが、今回の実装だとrが明示されていないですよね。r
がないと実装できなさそうですね(CodensityでcallCCのようなものを実装できなかった)...ContC
に r
を加えたものについても検討してみたのですが, それはそれで別の問題が出てしまいました..instance Algebra sig m => Algebra (Cont :+: sig) (ContC r m) where alg hdl sig ctx = case sig of R other -> -- _hole :: forall x. Cont r m (ctx x) -> m (ctx x) ContC (alg (_hole . hdl) other ctx >>=)
r
を型引数に加えた場合のインスタンスの実装です._hole
の部分で runContC
を使って ContC
をはがしたいのですが, 返り値の型が r
に固定されてしまって x
にできなくなってしまいます...f :: forall r. (a -> n r) -> n r
{-# LANGUAGE ScopedTypeVariables #-} ... instance Algebra sig m => Algebra (Cont :+: sig) (ContC r m) where alg :: forall ctx n a. Functor ctx => Handler ctx n (ContC r m) -> (Cont :+: sig) n a -> ctx () -> ContC r m (ctx a) alg hdl sig ctx = case sig of L (CallCC f) -> ContC \k -> undefined -- runContC (hdl . (<$ ctx) $ f (\x -> _hole)) k R other -> ContC \rest -> thread (hdlCont ~<~ hdl) other (pure ctx) >>= \(ContC x) -> x rest where hdlCont :: forall x. ContC r m (ContC r m x) -> m (ContC r m x) -- Handler (ContC r m) (ContC r m) m hdlCont = pure . join
thread
がキーっぽいですねthread
を使うことで`runContC`を`forall x.`じゃないところに持って行けたんですね…