簡體   English   中英

循環組成機器

[英]composing machines in a cycle

我正在使用機器庫,並且我有三個Process es

foo :: Process a b

bar :: Process b a

baz :: Process b c

我想將它們組合成barbaz都使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM