Scalazが反復する:「大きい」モナドの「IterateeT」に一致するように「列挙」Tを「持ち上げる」


445

EnumeratorTと対応するものがあれば、IterateeT一緒に実行できます:

val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length

(it &= en).run : Task[Int]

列挙モナドがiterateeモナドよりも「大きい」場合、私は一致するようにiterateeを使用するupか、より一般的にHoistは「持ち上げ」ます。

val en: EnumeratorT[String, Task] = ...
val it: IterateeT[String, Id, Int] = ...

val liftedIt = IterateeT.IterateeTMonadTrans[String].hoist(
  implicitly[Task |>=| Id]).apply(it)
(liftedIt &= en).run: Task[Int]

しかし、iterateeモナドが列挙子モナドよりも「大きい」場合、どうすればよいでしょうか。

val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...

it &= ???

HoistインスタンスEnumeratorTも、明らかな「リフト」メソッドもないようです。


59
きちんとした質問の場合は+1ですが、Enumerator実際にはがのラッパーにすぎないため、これが一般的なケースで可能かどうか頭からはわかりませStepT => IterateeTん。からStepT[E, BigMonad, A]
Travis Brown

12
ええ、直接実装しようとしたときにわかりました。しかし、論理的にEnumeratorは効果的な情報源ですよね?供給できるものを供給Aに使えるようになった気がしますTask[A]
lmm 2014年

8
私は答えを提供するのに十分なScalaについては知りませんが、独自のタイプ定義してそれを持ち上げるメカニズムを提供できませんでしたか?
Rob

8
いいえ、それはまったく同じことではありません。異なる種類の「持ち上げ」です。
lmm

2
@TravisBrownあなたがそれを書きたいなら、今のところこれに賞金があります。
アーロンホール

回答:


4

通常のエンコーディングでは、列挙子は本質的にStepT[E, F, ?] ~> F[StepT[E, F, ?]]です。この型をStep[E, G, ?] ~> G[Step[E, G, ?]]指定されたに変換するジェネリックメソッドを記述しようとするとF ~> G、すぐに問題が発生します。元の列挙子を適用できるようにするには、a Step[E, G, A]をに「下げる」必要がありStep[E, F, A]ます。

Scalazは次のような代替列挙子エンコーディングも提供します。

trait EnumeratorP[E, F[_]] {
  def apply[G[_]: Monad](f: F ~> G): EnumeratorT[E, G]
}

このアプローチにより、必要な効果に固有の列挙子を定義できますが、より多くのコンテキストを必要とするコンシューマーと連携するように「列挙」することができます。例を使用するように変更できますEnumeratorP(古いモナドの部分順序ではなく、より新しい自然変換アプローチ):

import scalaz._, Scalaz._, iteratee._, concurrent.Task

def enum: EnumeratorP[String, Id] = ???
def iter: IterateeT[String, Task, Int] = ???

val toTask = new (Id ~> Task) { def apply[A](a: A): Task[A] = Task(a) }

これで、次のように2つを作成できます。

scala> def result = (iter &= enum(toTask)).run
result: scalaz.concurrent.Task[Int]

EnumeratorP(場合モナドでF応用的である)、およびEnumeratorPコンパニオンオブジェクトは上のもののように多くのことを見て列挙子の定義を支援するためにいくつかの機能を提供してEnumeratorT-thereのをemptyperformenumPStream、など私が推測する必要がEnumeratorT使用して実装することができませんでしたインスタンスEnumeratorPエンコーディングが、私の頭の上から私は、彼らがどのように見えるかわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.