স্কালাজ পুনরাবৃত্তি: একটি "বড়" মনাদ জন্য "উত্তোলন" ume EnumeratorT` match IterateeT` সাথে মেলে


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]

যদি এলুমেটর মোনাড পুনরাবৃত্ত মোনাডের চেয়ে "বড়" হয় তবে আমি মেলাতে পুনরাবৃত্তিকে "লিফট" করতে 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]

তবে যখন ইন্টিরিটি মোনাড এনুমেটর মোনাডের চেয়ে "বড়" হয় তখন আমি কী করব?

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

it &= ???

এটির Hoistজন্য কোনও উদাহরণ বলে মনে হচ্ছে না EnumeratorTবা কোনও সুস্পষ্ট "লিফট" পদ্ধতিরও নেই।


59
একটি ঝরঝরে প্রশ্নের জন্য +1, তবে শীর্ষে আমি আমার মাথার বিষয়ে নিশ্চিত নই যে এটি সাধারণ ক্ষেত্রে সম্ভব, যেহেতু একটি Enumeratorসত্যিকার অর্থে কেবল একটি প্রায় একটি মোড়ক StepT => IterateeT, যা আপনাকে "পদত্যাগ" করার দরকার বলে প্রস্তাব দেয় থেকে একটি StepT[E, BigMonad, A]
ট্র্যাভিস ব্রাউন 21

12
হ্যাঁ, আমি যখন এটি সরাসরি প্রয়োগ করার চেষ্টা করেছি। কিন্তু যৌক্তিকভাবে একটি Enumeratorঠিক একটি কার্যকর উত্স, তাই না? মনে হচ্ছে আমার সরবরাহ Aকরা যায় এমন কোনও জিনিস ব্যবহার করতে সক্ষম হওয়া উচিত Task[A]
lmm

8
কোনও উত্তর দেওয়ার জন্য আমি স্কালার বিষয়ে পর্যাপ্ত পরিমাণে জানি না তবে আপনি নিজের ধরণের সংজ্ঞা দিতে এবং এর জন্য একটি উত্তোলন ব্যবস্থা সরবরাহ করতে পারেন নি ?
রব

8
না, এটি মোটেও একই জিনিস নয়, এটি একটি ভিন্ন ধরণের "উত্তোলন"।
lmm

2
আপনি যদি এটি লিখতে চান তবে @ ট্র্যাভিসব্রাউন এখনই এইটির উপর একটি অনুদান রয়েছে।
অ্যারন হল

উত্তর:


4

সাধারণ এনকোডিংয়ে একটি গণক মূলত ক StepT[E, F, ?] ~> F[StepT[E, F, ?]]। আপনি একটি জেনেরিক পদ্ধতি মধ্যে একটি এই ধরনের রূপান্তর লিখতে চেষ্টা করুন Step[E, G, ?] ~> G[Step[E, G, ?]]প্রদত্ত একটি F ~> Gআপনি দ্রুত একটি বিষয় পাতিত করব: আপনার প্রয়োজন "নীচু" একটি Step[E, G, A]একটি থেকে Step[E, F, A]অনুক্রমে মূল গণনাকারী আবেদন করতে পারবেন না।

স্কালাজ একটি বিকল্প এনুমুরেটর এনকোডিংও সরবরাহ করে যা এর মতো দেখায়:

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) }

আমরা এখন এই দুটি রচনা করতে পারেন:

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

EnumeratorPপরমাণুসদৃশ্য হয় (যদি Fআবেদন), এবং EnumeratorPসঙ্গী বস্তুর তথ্যসংগ্রহকারী যে বেশী মত অনেক চেহারা সংজ্ঞায়িত সাহায্য করার জন্য কিছু ফাংশন প্রদান করে EnumeratorTকিছু আছে এর empty, perform, enumPStream, ইত্যাদি আমি সেখানে অনুমান হতে হবে EnumeratorTদৃষ্টান্ত যে ব্যবহার করে বাস্তবায়ন করা করা যায়নি EnumeratorPএনকোডিং, কিন্তু আমার মাথার উপরে বন্ধ আমি নিশ্চিত সেগুলি দেখতে কেমন হবে দেখাবে আছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.