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 . jointhread がキーっぽいですねthreadを使うことで`runContC`を`forall x.`じゃないところに持って行けたんですね…