7

これは、パッケージEffectの公式チュートリアルで提供されている図です。pipes

 type Effect = Proxy X () () X

  Upstream | Downstream
     +---------+
     |         |
 X  <==       <== ()
     |         |
 () ==>       ==> X
     |    |    |
     +----|----+
          v
          r

Effectにはデータの流れがないのでProxy X X X X、すべての流れを封印するだけだと思っていました。ただし、代わりに、2 つの流入を許可します。それには特別な理由がありますか?Effectsignature を使用して、a が通常行うことを単に記述した場合Proxy X X X X、コンパイラを完全に正常に渡すことができます。

myMonad :: Proxy X X X X IO ()
myMonad = do
    a <- lift $ getLine
    lift $ print a
    return ()

runなぜこのようなことができないのでしょうか。

4

1 に答える 1

1

の既存の定義を取得し、その型を多少一般化するだけで、例から実行できます。myMonadrunEffect

import Pipes (lift)
import Pipes.Core (closed)
import Pipes.Internal

type Effect' a b = Proxy X a b X

-- Definition copied straight from Pipes.Core, type generalized to Effect'
runEffect' :: Monad m => Effect' a b m r -> m r
runEffect' = go
  where
    go p = case p of
        Request v _ -> closed v
        Respond v _ -> closed v
        M       m   -> m >>= go
        Pure    r   -> return r

eff :: Effect' X X IO ()
eff = do
    a <- lift $ getLine
    lift $ print a
    return ()

main :: IO ()
main = runEffect' eff
于 2015-10-23T02:21:56.743 に答える