2

リモートサーバーへの http リクエストを、ID を取得して Task[JValue] を生成する関数としてエンコードしています。

プログラムを簡素化するために、その関数を Process1 に変換したいと思います (単純化とは、Processes を可能な限りビルディング ブロックとして使用することを意味します)。

関数を変換したい

    reqDoc(id:A):Task[B]

(ここで、A は Id のタイプ、B は応答のタイプです)

    reqDoc:Process1[A,B]
4

1 に答える 1

5

私はあなたが を望んでいるとは思いません。これからProcess1を作成していた場合、あなたが望むものではないProcess1を作成することになるとProcess1[A, Task[B]]思います。

新しい を提供する に をChannel付けることができるを作成したいと思います。Aは、効果的な機能を生成するa の単なるエイリアスです。ProcessProcessChannelProcess

type Channel[+F[_],-I,O] = Process[F, I => F[O]]

関数は 1 つなので、同じ関数の無限ストリームを生成するプロセスを作成します。constant

// a String => Task[Int] that we'll make a channel from
val length: String => Task[Int] = (x => Task.delay(x.length))
// a channel is just a source of functions:
val lengthChannel = Process.constant(length)

Strings を生成する Process が与えられた場合 (ここでは 1 つだけ生成します):

val source: Process[Task,String] = Process.emit("asdf")

チャネルを通じてソースを実行することにより、プロセスを作成できます

val lengths = source through lengthChannel

プロセスを実行して、「asdf」の長さを取得できます

scala> lengths.runLog.run
res5: scala.collection.immutable.IndexedSeq[Int] = Vector(4)
于 2014-08-20T14:27:17.220 に答える