[解決済み] スカラズのイテレート。「より大きな」モナドのために `EnumeratorT` を `IterateeT` にマッチングさせる「リフティング」。
質問
もし
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]
もし、列挙者モナドが反復者モナドより "大きい" なら、私は
up
または、より一般的に
Hoist
を使用して、イテレートにマッチするように "lift" します。
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モナドがenumeratorモナドより"big"な場合はどうすればいいのでしょう?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
はないようです。
Hoist
のインスタンスです。
EnumeratorT
また、明らかなメソッドもありません。
解決方法は?
通常のエンコーディングでは、列挙子は基本的に
StepT[E, F, ?] ~> F[StepT[E, F, ?]]
. この型を変換する汎用メソッドを書こうとすると
Step[E, G, ?] ~> G[Step[E, G, ?]]
与えられた
F ~> G
を下げる必要があります。
Step[E, G, A]
を
Step[E, F, A]
を使用すると、元の列挙体を適用できるようになります。
また、Scalazは 代替の列挙体エンコーディング のようなものです。
trait EnumeratorP[E, F[_]] {
def apply[G[_]: Monad](f: F ~> G): EnumeratorT[E, G]
}
このアプローチにより、必要な効果に特化した列挙体を定義することができますが、よりリッチなコンテキストを必要とする消費者と連携するために "lifting"を行うことができます。この例を修正して
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) }
これで、次のように合成することができます。
scala> def result = (iter &= enum(toTask)).run
result: scalaz.concurrent.Task[Int]
EnumeratorP
はモナドである(もし
F
はアプリケーティブ)、そして
EnumeratorP
のような列挙子を定義するのに役立つ関数が用意されています。
EnumeratorT
-があります。
empty
,
perform
,
enumPStream
など。が必要なのでしょう。
EnumeratorT
を使用して実装することができないインスタンスです。
EnumeratorP
のエンコーディングがありますが、私の頭ではどのようなものかはわかりません。
関連
-
[解決済み] expr() での lit() の使用について
-
[解決済み] Scalaの「コンテキストバウンド」とは何ですか?
-
[解決済み] Scalaで「:+」は何を意味するのか
-
[解決済み] ScalaのDSLって何?[クローズド]
-
[解決済み] モナドはエンドファンクタのカテゴリではただのモノイドですが、何か問題でも?
-
[解決済み] Scalaのcase classとclassの違いは何ですか?
-
[解決済み】Scalaの記号演算子にはどんな意味があるの?
-
[解決済み】ScalaのCaseオブジェクトとEnumerationsの比較
-
[解決済み】ScalaのJavaConvertersとJavaConversionsの違いは何ですか?
-
[解決済み] Scalaの==と.equalsの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Spark - Sparkでパーセンタイルを計算する方法は?
-
[解決済み] scalaのforeachループ
-
[解決済み] Scalaのリターン
-
[解決済み] スカラズのイテレート。「より大きな」モナドのために `EnumeratorT` を `IterateeT` にマッチングさせる「リフティング」。
-
[解決済み] Scalaのapply関数とは何ですか?
-
[解決済み】Scalaでケースクラスのインスタンスをクローンして、1つのフィールドだけを変更するにはどうすればよいですか?
-
[解決済み】良いスカラズの紹介【終了しました
-
[解決済み】ScalaでVectorを選択するのはどんなとき?
-
[解決済み】レイジーバルって何するもの?
-
[解決済み] Scalaで環境変数を読み込む方法