আমি কীভাবে একটি প্রোগ্রাম পুনর্গঠন করব তা বোঝার চেষ্টা করছি যা আমি আগে রাষ্ট্রীয় রূপান্তরের ক্রম হিসাবে লিখেছিলাম:
আমার কিছু ব্যবসায়ের যুক্তি রয়েছে:
type In = Long
type Count = Int
type Out = Count
type S = Map[Int, Count]
val inputToIn: String => Option[In]
= s => try Some(s.toLong) catch { case _ : Throwable => None }
def transition(in: In): S => (S, Out)
= s => { val n = s.getOrElse(in, 0); (s + (in -> n+1), n+1) }
val ZeroOut: Out = 0
val InitialState: S = Map.empty
এগুলির সাথে আমি কিছু প্রাথমিক রাজ্যে (একটি খালি ম্যাপ) পাস করার জন্য একটি প্রোগ্রাম বানাতে চাই , স্টিডিনের ইনপুট পড়ি , এটিকে রূপান্তর করি In
, রাষ্ট্রের রূপান্তর পরিচালনা করি এবং বর্তমান অবস্থা S
এবং আউটপুটকে স্টাডাউটে আউটপুট Out
করি ।
পূর্বে, আমি এই জাতীয় কিছু করতাম:
val runOnce = StateT[IO, S, Out](s => IO.readLn.map(inputToIn) flatMap {
case None => IO((s, ZeroOut))
case Some(in) => val (t, o) = transition(in)(s)
IO.putStrLn(t.toString) |+| IO.putStrLn(o.toString) >| IO((t, o))
})
Stream.continually(runOnce).sequenceU.eval(InitialState)
তবে, স্ক্যালজ-স্ট্রিমের সাথে এই পদ্ধতির (রাষ্ট্রীয় রূপান্তরগুলির একটি স্রোত) কীভাবে সংযুক্ত করতে হয় তা দেখতে আমি সত্যিই লড়াই করছি । আমি এটি দিয়ে শুরু করেছি:
type Transition = S => (S, Out)
val NoTransition: Transition = s => (s, 0)
io.stdInLines.map(inputToIn).map(_.fold(NoTransition)(transition))
এই ধরনের হয়: Process[Task, Transition]
। আমি জানি না সেখান থেকে কোথায় যেতে হবে।
- আমি কীভাবে আমার পাস এবং
InitialState
প্রোগ্রামটি চালিত করব ,S
প্রতিটি ধাপে আউটপুটে থ্রেডিং করে পরেরটির ইনপুট হিসাবেS
? - আমি মান পেতে পারি
S
এবংOut
প্রতিটি পদক্ষেপ এবং সেগুলি মুদ্রণ stdout- এ (অভিমানী আমি তাদের স্ট্রিং রূপান্তর করতে পারেন)?
একক বোঝার জন্য ব্যবহার করার চেষ্টা করার সময়, আমি একইভাবে আটকে যাই:
for {
i <- Process.eval(Task.now(InitialState))
l <- io.stdInLines.map(inputToIn)
...
কোন সাহায্য ব্যাপকভাবে প্রশংসা করা হয়!
আমি এখন আরও কিছুটা পেয়েছি
type In_ = (S, Option[In])
type Out_ = (S, Out)
val input: Process[Task, In_]
= for {
i <- Process.emit(InitialState)
o <- io.stdInLines.map(inputToIn)
} yield (i, o)
val prog =
input.pipe(process1.collect[In_, Out_]) {
case (s, Some(in)) => transition(in)(s)
}).to(io.stdOutLines.contramap[Out_](_.toString))
তারপর
prog.run.run
এটি কাজ করে না: দেখে মনে হচ্ছে রাজ্য স্ট্রিমের মাধ্যমে থ্রেড করা হচ্ছে না । বরং প্রতিটি পর্যায়ে প্রাথমিক অবস্থায় প্রবেশ করা হচ্ছে।
পল চিয়াসানো এর পদ্ধতির ব্যবহারের পরামর্শ দিলেন process1.scan
। সুতরাং এখন আমি এই কাজ:
type In_ = In
type Out_ = (S, Out)
val InitialOut_ = (InitialState, ZeroOut)
val program =
io.stdInLines.collect(Function.unlift(inputToIn)).pipe(
process1.scan[In_, Out_](InitialOut_) {
case ((s, _), in) => transition(in)(s)
}).to(io.stdOutLines.contramap[Out_](_.shows))
এখানে একটি সমস্যা রয়েছে: এই নির্দিষ্ট উদাহরণে, আমার ধরণটিOut
একটি মনোড , সুতরাং আমার প্রারম্ভিক অবস্থাটি তার পরিচয় ব্যবহার করে তৈরি করা যেতে পারে তবে এটি সাধারণত হয় না। আমি তখন কি করতাম? (আমি অনুমান করি যে আমি এটি ব্যবহার করতে পারব Option
তবে এটি মনে হয় এটি অপ্রয়োজনীয়))