purescriptコルーチンの `pullFrom`と` connect`の違いは何ですか?

Albtzrly

purescript-coroutinesにaconnectpullFrom関数がある理由と、両方をいつ使用するのかがわかりませんタイプを見ると、「コミュニケーションの方向性」を変えることに慣れているようです(それが正しい考え方かどうかはわかりません)。

pullFrom :: forall o m a. MonadRec m => Consumer o m a -> Producer o m a -> Process m a

connect :: forall o f m a. (MonadRec m, Parallel f m) => Producer o m a -> Consumer o m a -> Process m a

だから私が消費者とプロデューサーを持っているなら...

consumer :: forall e a. (Show a) => Consumer a (Eff (console :: CONSOLE | e)) Unit
consumer = forever do
  s <- await
  lift (log $ show s)

numberProducer :: forall m. (Monad m) => Producer Int m Unit
numberProducer = go 0
  where
  go i = do emit i
            go (i + 1)

コンシューマーがプロデューサーからプルできることは私には理にかなっています。これを実行すると、表示されている数値を確認できます...

main = do
  runProcess (pullFrom consumer numberProducer)

しかし、私connectがプロデューサーからコンシューマーへの場合、それは何もしていないようです。プロデューサーとコンシューマーを接続すると、シグナリングはとは逆の方向に進むpullFromと思いますが、その考えが正しいかどうかはわかりません。

main = do
  runProcess (connect producer consumer)
gb。

さて、これにはちょっとした驚きがあります...でも、すぐにそれに行きます。

pullFrom プロセスが形成されたときにコンシューマーが「担当」するように導入されました。プロセスは、コンシューマーが開いている(入力を待っている)限り存在します。

connect プロデューサーまたはコンシューマーのいずれかが開いている限り実行され、プロセスは両方が完了したときにのみ終了します。

これを実現するにconnectParallel、作成されたプロセスがコンシューマーとプロデューサーの両方に依存するためクラス制約pullFromがありますconsumerプロセスはにのみ依存するため、これは必要ありません

ここで「楽しい」驚きが生まれます-そして私を少し混乱させました。EffそうではありませんParallel...では、コードはどのように機能しますか?これは、次のタイプを推測しているためですmain

main :: forall t. (Parallel t (Eff (console :: CONSOLE))) => Eff (console :: CONSOLE) Unit

したがって、プログラムの実行時には何も起こりません。JSではmainParallel制約のためにディクショナリが渡されEffから、が評価されることを期待しているためです。生成されたmainへの呼び出しは単なるMain.main();であるためEff、が必要になるため実際にを評価することはありませんMain.main(impossibleParallelDictionary)();

このタイプをあなたのmain:に追加してみてください

main :: Eff (console :: CONSOLE) Unit

そして、あなたはそれがもうタイプチェックをしないのを見るでしょう。

あなたは使用することができるAffけれども、とし、このためAffの違いconnectpullFrom、この例の区別がつきません。

import Prelude

import Control.Coroutine (Consumer, Producer, await, connect, emit, runProcess)
import Control.Monad.Aff (Aff, launchAff)
import Control.Monad.Aff.Console (CONSOLE, log)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Exception (EXCEPTION)
import Control.Monad.Rec.Class (forever)
import Control.Monad.Trans.Class (lift)

consumer :: forall e a. (Show a) => Consumer a (Aff (console :: CONSOLE | e)) Unit
consumer = forever do
  s <- await
  lift (log $ show s)

numberProducer :: forall m. (Monad m) => Producer Int m Unit
numberProducer = go 0
  where
  go i = do emit i
            go (i + 1)

main :: Eff (err :: EXCEPTION, console :: CONSOLE) Unit
main = void $ launchAff $ runProcess (connect numberProducer consumer)

例を少し変更すると、違いの図がわかります。

import Prelude

import Control.Coroutine (Consumer, Producer, await, emit, connect, runProcess)
import Control.Monad.Aff (Aff, launchAff, later')
import Control.Monad.Aff.Console (CONSOLE, log)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Exception (EXCEPTION)
import Control.Monad.Trans.Class (lift)

consumer :: forall e a. (Show a) => Consumer a (Aff (console :: CONSOLE | e)) Unit
consumer = do
  s <- await
  lift (log $ show s)

numberProducer :: forall eff. Producer Int (Aff eff) Unit
numberProducer = do
  emit 0
  lift $ later' 10000 $ pure unit

main :: Eff (err :: EXCEPTION, console :: CONSOLE) Unit
main = void $ launchAff $ runProcess (connect numberProducer consumer)

これにより、プログラムは0を出力し、10秒間待機して、終了します。プログラムに切り替えるconnect numberProducer consumerconsumer `pullFrom` numberProducer、0が出力され、すぐに終了します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

purescriptコルーチンの `pullFrom`と` connect`の違いは何ですか?

分類Dev

sqlx.Connect()とsqlx.Open()の違いは何ですか?

分類Dev

Login-AzureRmAccountとConnect-AzureRmAccountの違いは何ですか?

分類Dev

コルーチンの「yieldreturn0」と「yieldreturnnull」の違いは何ですか?

分類Dev

kotlinコルーチン、coroutineScopeとwithContextの違いは何ですか

分類Dev

Purescriptでは; ->と=>の違いは何ですか?

分類Dev

Kotlinでは、コルーチンと継続という用語の違いは何ですか?

分類Dev

node.jsのnet.connectとnet.createConnectionの違いは何ですか?

分類Dev

「+ =」と「= +」の違いは何ですか?

分類Dev

/ * ... * /と/ ** ... * /の違いは何ですか

分類Dev

「.equals」と「==」の違いは何ですか?

分類Dev

$ *と$ @の違いは何ですか

分類Dev

「$(this)」と「this」の違いは何ですか?

分類Dev

list()と[]の違いは何ですか

分類Dev

dict()と{}の違いは何ですか?

分類Dev

+ =と= +の違いは何ですか?

分類Dev

#{} $ {}と%{}の違いは何ですか?

分類Dev

「&nbsp;」の違いは何ですか と「」?

分類Dev

=と==の違いは何ですか?

分類Dev

=と==の違いは何ですか?

分類Dev

$( "")と$ .find( "")の違いは何ですか?

分類Dev

`&`と `ref`の違いは何ですか?

分類Dev

^ a | A $と^(a | A)$の違いは何ですか?

分類Dev

「$ pwd」と「./」の違いは何ですか?

分類Dev

=>と->の違いは何ですか?

分類Dev

`cat |`と `<`の違いは何ですか

分類Dev

..と...の違いは何ですか?

分類Dev

「Orda => [a]-> [a]-> [a]」と「[a]-> [a]-> [a]」の違いは何ですか

分類Dev

withとenvの違いは何ですか

Related 関連記事

  1. 1

    purescriptコルーチンの `pullFrom`と` connect`の違いは何ですか?

  2. 2

    sqlx.Connect()とsqlx.Open()の違いは何ですか?

  3. 3

    Login-AzureRmAccountとConnect-AzureRmAccountの違いは何ですか?

  4. 4

    コルーチンの「yieldreturn0」と「yieldreturnnull」の違いは何ですか?

  5. 5

    kotlinコルーチン、coroutineScopeとwithContextの違いは何ですか

  6. 6

    Purescriptでは; ->と=>の違いは何ですか?

  7. 7

    Kotlinでは、コルーチンと継続という用語の違いは何ですか?

  8. 8

    node.jsのnet.connectとnet.createConnectionの違いは何ですか?

  9. 9

    「+ =」と「= +」の違いは何ですか?

  10. 10

    / * ... * /と/ ** ... * /の違いは何ですか

  11. 11

    「.equals」と「==」の違いは何ですか?

  12. 12

    $ *と$ @の違いは何ですか

  13. 13

    「$(this)」と「this」の違いは何ですか?

  14. 14

    list()と[]の違いは何ですか

  15. 15

    dict()と{}の違いは何ですか?

  16. 16

    + =と= +の違いは何ですか?

  17. 17

    #{} $ {}と%{}の違いは何ですか?

  18. 18

    「&nbsp;」の違いは何ですか と「」?

  19. 19

    =と==の違いは何ですか?

  20. 20

    =と==の違いは何ですか?

  21. 21

    $( "")と$ .find( "")の違いは何ですか?

  22. 22

    `&`と `ref`の違いは何ですか?

  23. 23

    ^ a | A $と^(a | A)$の違いは何ですか?

  24. 24

    「$ pwd」と「./」の違いは何ですか?

  25. 25

    =>と->の違いは何ですか?

  26. 26

    `cat |`と `<`の違いは何ですか

  27. 27

    ..と...の違いは何ですか?

  28. 28

    「Orda => [a]-> [a]-> [a]」と「[a]-> [a]-> [a]」の違いは何ですか

  29. 29

    withとenvの違いは何ですか

ホットタグ

アーカイブ