[英]composing machines in a cycle
我正在使用機器庫,並且我有三個Process
es
foo :: Process a b
bar :: Process b a
baz :: Process b c
我想將它們組合成bar
和baz
都使用foo
的 output 作為輸入。 此外,這是我正在努力解決的部分,我想將bar
的 output 送回foo
,形成一個循環。 關於如何做的任何提示?
首先,您可以使用~>
按順序組合進程( Process xy -> Process yz -> Process xz
),因此問題減少到解釋Process aa
,您可以使用帶有緩沖區的遞歸 function 來完成。 緩沖區由Yield
擴展並由Await
消耗。 您希望如何在空緩沖區上處理Await
存在一些隨意性; 在這里,我只是采取“無輸入”繼續並正常恢復。
{-# LANGUAGE GADTs #-}
import Data.Machine
import Data.Machine.Process
loop :: Monad m => ProcessT m a a -> m ()
loop p = go [] p where
go :: Monad m => [a] -> ProcessT m a a -> m ()
go buffer p = runMachineT p >>= \s -> case s of
Stop -> pure ()
Yield o p -> go (buffer ++ [o]) p
Await p1 Refl p0 ->
case buffer of
[] -> go [] p0
i : buffer' -> go buffer' (p1 i)
loop3 :: Monad m => ProcessT m a b -> ProcessT m b c -> ProcessT m c a -> m ()
loop3 x y z = loop (x ~> y ~> z)
example :: ProcessT IO String String
example =
encased (Yield "world" (
encased (Await (\name ->
MachineT (putStrLn ("Hello " ++ name ++ "!") >> pure Stop)) Refl (error "No input"))))
main :: IO ()
main = loop example
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.