কোনও কাজ ছাড়াই রাষ্ট্র বজায় রাখা


10

আমি ফাংশনাল প্রোগ্রামিং শিখছি এবং অ্যাসাইনমেন্ট ব্যবহার না করে কিছু নির্দিষ্ট পরিস্থিতি কীভাবে প্রয়োগ করা হয় তা বুঝতে আমার সমস্যা হয়। নীচের সাধারণ সমস্যাটি আমার বিভ্রান্তির পরিমাণ অনেকটা পূর্ণ করে তোলে।

একটি প্রোগ্রাম লিখুন যা প্রদত্ত ডেটা স্ট্রাকচারের পরিবর্তনগুলি সম্পর্কে ইভেন্টগুলি গ্রহণ করে এবং যখন এই ডেটা স্ট্রাকচারটি একটি নির্দিষ্ট স্থানে পৌঁছায় তখন ইভেন্টগুলি নির্গত করে।

সুতরাং আমার কাছে ডেটাস্ট্রাকচারের একটি অনুলিপি রয়েছে যা আমি রক্ষণ করি

datastructure_copy::DataStructure 

আমার কাছে ইভেন্টগুলির স্ট্রিম রয়েছে যা পাল্টে গেলে তা পালটে যায়:

datastructure_changes::Stream Change

আমার একটি ফাংশন রয়েছে যা ডেটা কাঠামোর পরিবর্তনের জন্য প্রয়োগ করে এবং এটির একটি নতুন অনুলিপি প্রদান করে:

apply_change::Change -> DataStructure -> DataStructure

এবং আমার কাছে একটি প্রিকিকেট রয়েছে যা পরীক্ষা করে ডেটা রাজ্যকে পছন্দসই অবস্থায় পৌঁছেছে কিনা তা পরীক্ষা করে।

is_ready::DataStructure ->Boolean

অন্য কথায় আমার স্ট্রিমে কাজ করে এমন 'হ্রাস' এর মতো কিছু দরকার।

আমি জানি যে এটি বাস্তবায়নের একটি উপায় হ'ল প্রতিবার পরিবর্তন আসার সাথে সাথে রাষ্ট্রটিকে পুনরায় সংশোধন করা, তবে এটি অযৌক্তিক বলে মনে হয়। আমি রাজ্য মনাদের সাথে কিছুটা খেলেছি, তবে এটি আমার কাছে দেখে মনে হচ্ছে এটি অন্যরকম সমস্যা সমাধানের জন্য।

তাহলে কি অন্য উপায় আছে?

মনে রাখবেন যে আমার প্রশ্নটি সম্পূর্ণরূপে ধারণামূলক এবং আমি হাস্কেলের সাথে গভীরভাবে পরিচিত নই।


এক বা অন্য কোনও উপায়ে আপনি হাসকেলে কোনও 'অ্যাসাইনমেন্ট' (অ্যাসাইনমেন্ট এবং বাইন্ডিংয়ের মধ্যে পার্থক্যটি নোট করুন) দেখতে পাবেন না কারণ 'হাস্কেলের "অ্যাসাইনমেন্ট", "পরিবর্তনীয় অবস্থা", বা "ভেরিয়েবল" এর কোনও ধারণা নেই এবং এটি একটি "খাঁটি" ক্রিয়ামূলক ভাষা "' । রাজ্য মোনাড যা আপনি খুঁজছেন তা হওয়া উচিত, আপনার কীভাবে এটি ব্যবহার করবেন তা শিখতে হবে। আপনি যদি চান তবে আমি আজ আরও পরে আরও বিস্তৃত উত্তর দিতে পারি।
ফ্রান্সেস্কো গ্রামানো 19

উত্তর:


2

আমি জানি যে এটি বাস্তবায়নের একটি উপায় হ'ল প্রতিবার পরিবর্তন আসার সাথে সাথে রাষ্ট্রটিকে পুনরায় সংশোধন করা, তবে এটি অযৌক্তিক বলে মনে হয়।

কোনও ঘটনা ঘটে যাওয়ার সময়ে যদি পরিবর্তনগুলি প্রয়োগ হয় তবে তা যদি একরকম বা অন্য কোনও উপায়ে বিতরণ না করা হয় তবে প্রতিবার কোনও ঘটনা ঘটে গেলে আপনাকে রাষ্ট্রটির পুনরায় সংশোধন করতে হবে, কারণ চূড়ান্ত অবস্থা প্রাথমিক অবস্থা ছাড়াও একের পর এক পরিবর্তন। এমনকি যদি পরিবর্তনগুলি বিতরণযোগ্য হয় তবে আপনি সাধারণত একটি রাষ্ট্রকে পরের দিকে রূপান্তর করতে চান, যেহেতু আপনি আপনার প্রক্রিয়াটি একটি প্রদত্ত রাষ্ট্র যত দ্রুত পৌঁছেছে তত দ্রুত বন্ধ করতে চান, এবং যেহেতু আপনাকে পরবর্তী রাষ্ট্রটি নির্ধারণ করতে হবে যে এটি নির্ধারণ করার জন্য নতুন একটি হ'ল কাঙ্ক্ষিত রাষ্ট্র।

ফাংশনাল প্রোগ্রামিংয়ে, রাষ্ট্র পরিবর্তনগুলি সাধারণত ফাংশন কল এবং / অথবা ফাংশন পরামিতি দ্বারা প্রতিনিধিত্ব করা হয়।

আপনি কখনই অনুমান করতে পারবেন না যে কখন চূড়ান্ত অবস্থা গণনা করা হবে, আপনার লেজবিহীন পুনরাবৃত্তি ফাংশন ব্যবহার করা উচিত নয়। রাজ্যের একটি স্রোত, যেখানে প্রতিটি রাজ্য পূর্ববর্তীগুলির উপর ভিত্তি করে তৈরি করা ভাল বিকল্প হতে পারে।

সুতরাং আপনার ক্ষেত্রে, আমি স্ক্যালায় নিম্নলিখিত কোড দ্বারা প্রশ্নের উত্তর দেব:

import scala.util.Random

val initState = 0.0
def nextState(state: Double, event: Boolean): Double = if(event) state + 0.3 else state - 0.1 // give a new state
def predicate(state: Double) = state >= 1

// random booleans as events
// nb: must be a function in order to force Random.nextBoolean to be called for each  element of the stream
def events(): Stream[Boolean] = Random.nextBoolean #:: events()  

val states: Stream[Double] = initState #:: states.zip(events).map({ case (s,e) => nextState(s,e)}) // a stream of all the successive states

// stop when the state is >= 1 ;
// display all the states computed before it stopped
states takeWhile(! predicate(_)) foreach println 

উদাহরণস্বরূপ যা দিতে পারে (আমি আউটপুটটি সহজ করেছিলাম):

0.0
0.3
0.2
0.5
0.8

val states: Stream[Double] = ... ধারাবাহিক রাজ্য গণনা করা হয় যেখানে লাইন।

এই স্ট্রিমের প্রথম উপাদানটি সিস্টেমের প্রাথমিক অবস্থা। zipইভেন্টগুলির স্ট্রিমের সাথে রাজ্যের স্রোতকে একত্রে যুক্ত উপাদানগুলির জোড়ের একত্রে প্রবাহিত করে, প্রতিটি জুটি একটি (রাষ্ট্র, ইভেন্ট) হয়ে থাকে। mapপুরানো রাষ্ট্র এবং সম্পর্কিত ইভেন্টের ফাংশন হিসাবে গণনা করে প্রতিটি জুটিকে একক মানতে নতুন রাজ্যে রূপান্তরিত করে। একটি নতুন রাষ্ট্র হ'ল একটি পূর্বে গণিত রাষ্ট্র, এবং যুক্ত ইভেন্ট যা রাষ্ট্রকে "সংশোধন করে"।

সুতরাং মূলত, আপনি একটি সম্ভাব্য অসীম স্ট্রিমের সংজ্ঞা দিন, প্রতিটি নতুন রাজ্যই শেষ গণিত রাষ্ট্রের একটি ক্রিয়াকলাপ এবং একটি নতুন ইভেন্ট। যেহেতু স্ট্রিমগুলি (অন্যদের মধ্যে) স্কালায় অলস, তাই কেবলমাত্র চাহিদা অনুযায়ী গণনা করা হয়, তাই আপনাকে অকেজো রাজ্যগুলি গণনা করতে হবে না এবং আপনি যতগুলি রাজ্য চান তা গণনা করতে পারেন।

যদি আপনি কেবল সেই প্রথম রাজ্যে আগ্রহী হন যা শিকারীকে সম্মান করে তবে কোডের শেষ লাইনটি প্রতিস্থাপন করুন:

states find predicate get

যা পুনরুদ্ধার করে:

res7: Double = 1.1

val states: Stream[Double]...
যাদুটি

অবশ্যই। আমার সম্পাদনা দেখুন।
এমগোইমনে

1

আপনি বলছেন যে আপনার 2 টি ফাংশন রয়েছে:

apply_change::Change -> DataStructure -> DataStructure
is_ready::DataStructure ->Boolean

এবং যদি আমি আপনাকে এখনই বুঝতে পারি তবে is_readyএটি ব্যয়বহুল তাই আপনি প্রতিটি পরিবর্তন ইভেন্টের জন্য বার বার এটি করতে চান না।

আপনার যা দরকার তা হল একটি ফাংশন একটি প্রাথমিক ডেটা স্ট্রাকচার লাগে এবং এটিকে একটি সরল অবস্থায় পরিণত করে এবং এমন একটি ফাংশন যা ঘনীভূত অবস্থা গ্রহণ করে, একটি পরিবর্তন নেয় এবং একটি নতুন ঘনীভূত অবস্থাকে আউটপুট করে।

বলুন ডেটা স্ট্রাকচার একটি ট্রিপলেট x,y,zএবং আপনি x, y এবং z এর প্রধান সংখ্যা হওয়ার জন্য অপেক্ষা করছেন। আপনার ঘনীভূত রাষ্ট্রটি তখন কোনও সেট, যা x, y, z প্রধান নয়। এক্স প্রাইম তৈরি করে এমন একটি পরিবর্তন সেট থেকে এক্স সরিয়ে দেয়। এক্স প্রাইম নয় এমন একটি পরিবর্তন সেটে এক্স যুক্ত করে (যদি উপস্থিত না থাকে)। ডেটা স্ট্রাকচার প্রস্তুত তবে সেটটি খালি রয়েছে।

ধারণাটি হবে যে কনডেন্সড স্টেট আপডেট করা ডেটা স্ট্রাকচার আপডেট করার চেয়ে অনেক কম সস্তা এবং স্ক্র্যাচ থেকে ইস_ডিআর কম্পিউটিং করা।

দ্রষ্টব্য: একটি আরও ভাল পদ্ধতির হতে পারে যে এক্স, ওয়াই, জেড কোনটি প্রধান হওয়ার জন্য পরীক্ষা করা হয়েছিল এবং তারা কোথায় তা ট্র্যাক করে রাখা। প্রতিটি পরিবর্তনের জন্য আপনি যাচাইকৃত না হিসাবে সম্পর্কিত ক্ষেত্রটিকে পতাকাঙ্কিত করুন। তারপরে যখন ইস_ডিয়ার বলা হয় তখন আপনাকে চেক করে মনে রাখবেন। এটি আরও ভাল যদি আপনি প্রতিটি পরিবর্তনের পরে ইস_ডিডি না পরীক্ষা করেন যেহেতু এক্স একাধিকবার পরিবর্তন করতে পারে এবং আপনি কেবল একবার প্রাইমের জন্য যাচাই করেন।

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