(ক্রিয়ামূলক) প্রতিক্রিয়াশীল প্রোগ্রামিং কী?


1148

আমি প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের উইকিপিডিয়া নিবন্ধটি পড়েছি । আমি কার্যকরী প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের ছোট্ট নিবন্ধটিও পড়েছি । বর্ণনাগুলি বেশ বিমূর্ত।

  1. কার্যকরী প্রতিক্রিয়াশীল প্রোগ্রামিং (এফআরপি) এর অর্থ কী?
  2. প্রতিক্রিয়াশীল প্রোগ্রামিং (অ-প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের বিপরীতে?) কী রয়েছে?

আমার পটভূমি অত্যাবশ্যক / ওও ভাষাগুলিতে রয়েছে, সুতরাং এই দৃষ্টান্তের সাথে সম্পর্কিত এমন একটি ব্যাখ্যা প্রশংসিত হবে।


159
এখানে সক্রিয় কল্পনা এবং ভাল গল্প বলার দক্ষতা সম্পন্ন একটি লোক পুরো জিনিসটি গ্রহণ করে। paulstovell.com/reactive-pogramming
মেলা

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


5
আমার যা দেখেছি এক, উদাহরণ ভিত্তি করে: gist.github.com/staltz/868e7e9bc2a7b8c1f754
Razmig

2
আমি প্রথম রুক্ষ ছাপ হিসাবে স্প্রেডশিট উপমাটি খুব সহায়ক বলে মনে করি (বব এর উত্তর দেখুন: stackoverflow.com/a/1033066/1593924 )। একটি স্প্রেডশীট সেল অন্যান্য কোষের পরিবর্তনগুলিতে প্রতিক্রিয়া জানায় (টানে) তবে পৌঁছায় না এবং অন্যকে পরিবর্তন করে না (ধাক্কা দেয় না)। শেষ ফলাফলটি হ'ল আপনি একটি ঘর পরিবর্তন করতে পারেন এবং আরও একটি জিলিয়ন অন্যদের তাদের নিজস্ব প্রদর্শনগুলি 'স্বাধীনভাবে' আপডেট করতে পারেন।
জন কমবস

উত্তর:


931

আপনি যদি এফআরপি-র জন্য কোনও অনুভূতি পেতে চান তবে আপনি 1998 এর পুরানো ফরাস টিউটোরিয়াল দিয়ে শুরু করতে পারেন , যা অ্যানিমেটেড চিত্রগুলি রয়েছে। কাগজপত্রের জন্য, ফাংশনাল রিঅ্যাকটিভ অ্যানিমেশন দিয়ে শুরু করুন এবং তারপরে আমার হোম পৃষ্ঠায় প্রকাশের লিঙ্কে লিঙ্কগুলি এবং হাস্কেল উইকিতে এফআরপি লিঙ্ক অনুসরণ করুন ।

ব্যক্তিগতভাবে, আমি কীভাবে এটি বাস্তবায়িত হতে পারে তার ঠিকানা দেওয়ার আগে এফআরপি বলতে কী বোঝায় তা ভাবতে চাই । (কোনও নির্দিষ্টকরণ ছাড়াই কোড কোনও প্রশ্ন ছাড়াই একটি উত্তর এবং এভাবে "এমনকি ভুলও নয়")) সুতরাং আমি থমাস কে অন্য উত্তর (গ্রাফ, নোড, প্রান্ত, গুলি, কার্যকরকরণ, প্রয়োগ, ইত্যাদি)। অনেকগুলি বাস্তবায়নের শৈলী রয়েছে, তবে কোনও বাস্তবায়ন এফআরপি কী তা বলে না ।

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

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

তো, এফআরপি কী? আপনি নিজে এটি আবিষ্কার করতে পারে। এই ধারণাগুলি দিয়ে শুরু করুন:

  • গতিশীল / বিকশিত মান (যেমন, "সময়ের সাথে সাথে মানগুলি") নিজের মধ্যে প্রথম শ্রেণির মান। আপনি সেগুলি সংজ্ঞায়িত করতে এবং তাদেরকে একত্রিত করতে, এটিকে ফাংশনে এবং বাইরে রেখে দিতে পারেন। আমি এই জিনিসগুলিকে "আচরণ" বলেছি।

  • আচরণগুলি কয়েকটি ধ্রুবক (স্থিতিশীল) আচরণ এবং সময় (একটি ঘড়ির মতো) এর মতো তৈরি হয় এবং তারপরে ধারাবাহিক এবং সমান্তরাল সংমিশ্রণ দিয়ে তৈরি হয়। এন আচরণগুলি এন-আরি ফাংশন (স্থিত মানের উপর), "পয়েন্ট-ওয়াইজ", অর্থাত্ ক্রমান্বয়ে ক্রমাগত প্রয়োগ করে একত্রিত হয়।

  • বিচ্ছিন্ন ঘটনাটির জন্য অ্যাকাউন্ট করতে, "ইভেন্ট" এর আরও একটি ধরণের (পরিবার) থাকুন যার প্রত্যেকটিরই ঘটনার একটি স্ট্রিম (সীমাবদ্ধ বা অসীম) থাকে। প্রতিটি ঘটনার একটি সম্পর্কিত সময় এবং মান থাকে।

  • সমস্ত আচরণ এবং ইভেন্টগুলি তৈরি করা যেতে পারে এমন রচনামূলক শব্দভাণ্ডারের সাথে সামনে আসার জন্য কয়েকটি উদাহরণ দিয়ে খেলুন। আরও সাধারণ / সাধারণ যে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো

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

যদি আপনি এই নীতিগুলি অবিচল থাকেন তবে আমি আশা করি আপনি এফআরপি-র চেতনাতে কম-বেশি কিছু পাবেন।

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

সঠিকভাবে এবং দক্ষতার সাথে এই মডেলটি প্রয়োগ করা বেশ চ্যালেঞ্জ ছিল, তবে এটি অন্য গল্প।


78
আমি কার্যকরী প্রতিক্রিয়াশীল প্রোগ্রামিং সম্পর্কে সচেতন ছিলাম। এটি আমার নিজের গবেষণার সাথে সম্পর্কিত বলে মনে হচ্ছে (ইন্টারেক্টিভ পরিসংখ্যানের গ্রাফিক্সে) এবং আমি নিশ্চিত যে অনেকগুলি ধারণা আমার কাজের জন্য সহায়ক হবে। তবে, ভাষাটি অতীতের পক্ষে পাওয়া আমার পক্ষে খুব কঠিন find আমি কী ঘটছে তা বুঝতে "ডেনোটেশনাল শব্দার্থবিজ্ঞান" এবং "টাইপ ক্লাস মরফিজম" সম্পর্কে সত্যই শিখতে হবে? বিষয়টিতে একটি সাধারণ শ্রোতা পরিচিতি খুব দরকারী হবে।
হ্যাডলি

212
@ কনোনাল: আপনি কী বিষয়ে কথা বলছেন তা আপনি স্পষ্টভাবেই জানেন তবে আপনার ভাষা অনুমান করে আমার কাছে কম্পিউটারের গণিতে ডক্টরেট আছে, যা আমি করি না। আমার কাছে সিস্টেম ইঞ্জিনিয়ারিংয়ের একটি পটভূমি এবং কম্পিউটার এবং প্রোগ্রামিং ভাষার সাথে 20+ বছরের অভিজ্ঞতা রয়েছে, তবুও আমি অনুভব করি যে আপনার প্রতিক্রিয়া আমাকে অবাক করে দিয়েছে। আমি আপনাকে উত্তরটি ইংরেজিতে পুনরায় পোস্ট করার জন্য চ্যালেঞ্জ
জানাই

50
@ minplay.dk: আপনার মন্তব্যগুলি আমাকে বিশেষত আপনি কী বোঝেন না সে সম্পর্কে খুব বেশি কিছু দিতে দেয় না এবং আপনি কী ইংরেজির বিশেষ উপসাগরটি সন্ধান করছেন সে সম্পর্কে বন্য অনুমান করতে আমি আগ্রহী। যাইহোক, আমি আপনাকে উপরে আমার ব্যাখ্যাগুলির কী দিকগুলি সম্পর্কে আপনি ট্রিপ করে চলেছেন তা সুনির্দিষ্টভাবে বলতে আমন্ত্রণ জানাচ্ছি যাতে আমি এবং অন্যরা আপনাকে সহায়তা করতে পারি। উদাহরণস্বরূপ, এমন কোনও শব্দ রয়েছে যা আপনি সংজ্ঞায়িত করতে চান বা ধারণাগুলি চান যার জন্য আপনি উল্লেখ যুক্ত করতে চান? আমি আমার লেখার স্বচ্ছতা এবং অ্যাক্সেসযোগ্যতার উন্নতি করতে চাই - এটিকে নিস্তেজ করে না রেখে।
কনল

27
"নির্ধারণ" / "নির্ধারণ" এর অর্থ একটি একক, সু-সংজ্ঞায়িত সঠিক মান রয়েছে। বিপরীতে, প্রায় সমস্ত প্রবণতা সম্মতিসূচক একটি শিডিয়ুলার উপর নির্ভর করে বা আপনি খুঁজছেন বা না দেখছেন তার উপর নির্ভর করে বিভিন্ন উত্তর দিতে পারে এবং তারা এমনকি অচলাবস্থা রাখতে পারে। "শব্দসম্পর্কিত" (এবং আরও নির্দিষ্টভাবে "ডোনোটেশনাল") "অপারেশনাল" এর বিপরীতে একটি অভিব্যক্তি বা উপস্থাপনার মান ("ডোনোটেশন") বোঝায় (উত্তরটি কীভাবে গণনা করা হয় বা কতটা স্থান এবং / অথবা সময় কী ব্যয় করে? মেশিন ধরনের)।
কনাল

18
আমি @ মাইন্ডপ্লে.ডকে সাথে একমত, যদিও আমি খুব বেশি দিন মাঠে থাকব বলে বড়াই করতে পারি না। যদিও আপনি দেখে মনে হচ্ছে আপনি কী সম্পর্কে কথা বলছেন তা তবুও এটি আমাকে কী তা সম্পর্কে একটি তাত্ক্ষণিক, সংক্ষিপ্ত এবং সাধারণ বোঝাপড়া দেয় নি, কারণ আমি এসও-তে আশা করার মতো যথেষ্ট ক্ষতিগ্রস্থ করেছি। এই উত্তরটি প্রাথমিকভাবে আমার প্রথমটির উত্তর না দিয়েই আমাকে এক টন নতুন প্রশ্নের দিকে চালিত করে। আমি আশা করছি যে ক্ষেত্রে এখনও অপেক্ষাকৃত অজ্ঞ থাকার অভিজ্ঞতা ভাগ করে নেওয়া আপনার সত্যিকারের কতটা সহজ এবং সংক্ষিপ্ত হওয়া দরকার তা অন্তর্দৃষ্টি দিতে পারে। আমি ওপি, বিটিডব্লিউর মতো একই পটভূমি থেকে এসেছি।
জিজ্ঞাসা বি।

739

খাঁটি ফাংশনাল প্রোগ্রামিংয়ে কোনও পার্শ্ব-প্রতিক্রিয়া নেই। বিভিন্ন ধরণের সফ্টওয়্যারের জন্য (উদাহরণস্বরূপ, ব্যবহারকারীর মিথস্ক্রিয়া সহ যে কোনও কিছু) পার্শ্ব-প্রতিক্রিয়া কোনও স্তরে প্রয়োজনীয়।

কার্যক্ষম শৈলী ধরে রাখার সময় আচরণের মতো পার্শ্ব-প্রতিক্রিয়া পাওয়ার একটি উপায় হ'ল কার্যকরী প্রতিক্রিয়াশীল প্রোগ্রামিং। এটি কার্যকরী প্রোগ্রামিং এবং প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের সংমিশ্রণ। (উইকিপিডিয়া নিবন্ধটি আপনি সংযুক্ত করেছেন যা পরবর্তীকালের সম্পর্কে))

প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের পিছনে মূল ধারণাটি হ'ল এমন কিছু ডেটাটাইপ রয়েছে যা "সময়ের সাথে সাথে" একটি মান উপস্থাপন করে। এই পরিবর্তনগুলি-ওভার-টাইম মানগুলিতে জড়িত সংখ্যায় তাদের নিজস্ব মান থাকবে যা সময়ের সাথে সাথে পরিবর্তিত হয়।

উদাহরণস্বরূপ, আপনি পূর্ণসংখ্যার ওভার-টাইম মানগুলির জুটি হিসাবে মাউস স্থানাঙ্ককে উপস্থাপন করতে পারেন। ধরা যাক আমাদের মতো কিছু ছিল (এটি ছদ্ম-কোড):

x = <mouse-x>;
y = <mouse-y>;

সময়ের যে কোনও মুহুর্তে, x এবং y এর মাউসের স্থানাঙ্ক থাকবে। অ-প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের বিপরীতে, আমাদের কেবল একবার এই অ্যাসাইনমেন্টটি করা দরকার, এবং এক্স এবং y ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে "আপ টু ডেট" থাকবে। এই কারণেই রিঅ্যাকটিভ প্রোগ্রামিং এবং ফাংশনাল প্রোগ্রামিং একসাথে খুব ভালভাবে কাজ করে: প্রতিক্রিয়াশীল প্রোগ্রামিং পরিবর্তনশীল রূপান্তরগুলির প্রয়োজনটিকে সরিয়ে দেয়, তবুও আপনাকে ভেরিয়েবল মিউটেশনগুলির সাথে কী অর্জন করতে পারে তার অনেক কিছুই করতে দেয়।

এরপরে যদি আমরা এর ভিত্তিতে কিছু গণনা করি তবে ফলাফলগুলি মানগুলিও সময়ের সাথে সাথে পরিবর্তিত হয়। উদাহরণ স্বরূপ:

minX = x - 16;
minY = y - 16;
maxX = x + 16;
maxY = y + 16;

এই উদাহরণে, minXসর্বদা মাউস পয়েন্টারটির x স্থানাঙ্কের চেয়ে 16 কম হবে। প্রতিক্রিয়াশীল-সচেতন গ্রন্থাগারগুলির সাহায্যে আপনি এর পরে এমন কিছু বলতে পারেন:

rectangle(minX, minY, maxX, maxY)

এবং একটি 32x32 বাক্সটি মাউস পয়েন্টারটির চারপাশে টানা হবে এবং এটি যেখানেই সরানো হবে সেখানে এটি ট্র্যাক করবে।

ক্রিয়ামূলক প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের জন্য এখানে একটি দুর্দান্ত কাগজ রয়েছে


25
সুতরাং প্রতিক্রিয়াশীল প্রোগ্রামিং কি ঘোষিত প্রোগ্রামিংয়ের একটি রূপ?
Troelskn

31
> তাহলে প্রতিক্রিয়াশীল প্রোগ্রামিং কি ডিক্লেয়টিভ প্রোগ্রামিং এর এক রূপ? ফাংশনাল রিঅ্যাকটিভ প্রোগ্রামিং হ'ল ফাংশনাল প্রোগ্রামিংয়ের একটি রূপ, যা ঘোষণামূলক প্রোগ্রামিংয়ের একটি রূপ।
কনল

7
@ ইউজার 712092 আসলে নয়, না। উদাহরণস্বরূপ, আমি যদি sqrt(x)আপনার ম্যাক্রোর সাথে সি তে কল করি তবে এটি কেবল গণনা করে sqrt(mouse_x())এবং আমাকে একটি দ্বিগুণ ফিরিয়ে দেয়। সত্যিকারের কার্যক্ষম প্রতিক্রিয়াশীল সিস্টেমে sqrt(x)একটি নতুন "সময়ের সাথে ডাবল" ফিরিয়ে দেয়। আপনি যদি কোনও এফআর সিস্টেম অনুকরণ করার চেষ্টা করতে থাকেন তবে আপনাকে #defineম্যাক্রোর পক্ষে ভেরিয়েবলগুলি শপথ করতে হবে। এফআর সিস্টেমগুলি সাধারণত স্টাফগুলিকে পুনরায় গণনা করার সময় কেবল পুনরায় গণনা করতে পারে, যখন ম্যাক্রোগুলি ব্যবহার করার অর্থ আপনি অব্যাহতভাবে সমস্ত উপায়ে সমস্ত কিছু পুনরায় মূল্যায়ন করতেন।
লরেন্স গনসাল্ভেস

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

4
@tieTYT এক্স কখনই পুনরায় নিয়োগ / পরিবর্তন করা হয় না। x এর মান হ'ল সময়ের সাথে সাথে মানগুলির ক্রম। এটিকে দেখার আরেকটি উপায় হ'ল x এর পরিবর্তে একটি "স্বাভাবিক" মান, সংখ্যার মতো, এক্স এর মান (ধারণাগত) এমন একটি ফাংশন যা প্যারামিটার হিসাবে সময় নেয়। (এটি একটি ওভারসিম্প্লিফিকেশন কিছুটা is আপনি এমন সময় মান তৈরি করতে পারবেন না যা আপনাকে মাউসের অবস্থানের মতো জিনিসগুলির ভবিষ্যতের ভবিষ্যদ্বাণী করতে দেয়))
লরেন্স গনসাল্ভেস

144

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

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


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

এই উদাহরণটি ইভেন্ট-চালিত প্রোগ্রামিং এবং প্রতিক্রিয়াশীল পদ্ধতির মধ্যে পার্থক্যের উপর জোর দেয়, যেখানে আপনি কেবল বুদ্ধিমান রাউটিং ব্যবহারের নির্ভরতা ঘোষণা করেন।
কিনজেলম

131

আমার কাছে এটি প্রতীকটির প্রায় 2 টি পৃথক অর্থ =:

  1. গণিত x = sin(t)মানে, যে xহয় ভিন্ন নাম জন্য sin(t)। সুতরাং লেখার x + yএকই জিনিস sin(t) + y। কার্যকরী প্রতিক্রিয়াশীল প্রোগ্রামিং এই ক্ষেত্রে গণিতের মতো: আপনি যদি লিখেন তবে x + yএটির মানটি tযে সময়ে ব্যবহৃত হয় তার সাথে এটি গণনা করা হয়।
  2. C-মত প্রোগ্রামিং ভাষা (অনুজ্ঞাসূচক ভাষা), x = sin(t)একটি কাজ: এটি তার মানে xদোকানে মান sin(t) নিয়োগ সময় নেওয়া।

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

4
গণিত x = sin(t)মানে xমান sin(t)দেওয়া t। এটি ফাংশন হিসাবে আলাদা নাম নয়sin(t) । অন্যথায় এটি হবে x(t) = sin(t)
দিমিত্রি জইতসেভ

+ দিমিত্রি জাইতসেভ সমান চিহ্নটির গণিতের বিভিন্ন অর্থ রয়েছে। এর মধ্যে একটি হ'ল আপনি যখনই বাম দিক দেখেন আপনি ডান পাশ দিয়ে এটিকে অদলবদল করতে পারেন । উদাহরণস্বরূপ 2 + 3 = 5বা a**2 + b**2 = c**2
ব্যবহারকারী 712092

71

ঠিক আছে, পটভূমির জ্ঞান থেকে এবং উইকিপিডিয়া পৃষ্ঠায় আপনি যে দিকে ইঙ্গিত করেছেন তা পড়ে, এটি প্রতীয়মান হয় যে প্রতিক্রিয়াশীল প্রোগ্রামিং হ'ল ডেটাফ্লো কম্পিউটিংয়ের মতো তবে নির্দিষ্ট বাহ্যিক "স্টিমুলি" দ্বারা নোডের সেট সেট করে এবং তাদের গণনা সম্পাদন করে।

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

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

"ডেটাফ্লো কম্পিউটিং" সম্পর্কিত আরও তথ্যের জন্য, উইকিপিডিয়ায় বা আপনার প্রিয় অনুসন্ধান ইঞ্জিন ব্যবহার করে সেই দুটি শব্দ অনুসন্ধান করুন। সাধারণ ধারণাটি হ'ল: প্রোগ্রামটি নোডগুলির একটি নির্দেশিত গ্রাফ, প্রতিটি কিছু সহজ গণনা সম্পাদন করে। এই নোডগুলি গ্রাফ লিঙ্কগুলির মাধ্যমে একে অপরের সাথে সংযুক্ত রয়েছে যা অন্যের ইনপুটগুলিকে কিছু নোডের আউটপুট সরবরাহ করে।

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

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

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

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


1
ঠিক আছে, এখন উপরে কিছু ভাল উত্তর আছে। আমার পোস্টটি সরিয়ে ফেলা উচিত? যদি আমি দু'জন বা তিনজন লোককে দেখায় এটিতে কিছুই যুক্ত হয় না, তবে এটির সহায়ক গণনা না হলে আমি এটিকে মুছে ফেলব। এটিকে এখানে রেখে কোনও লাভ নেই যদি না এটি মানটির কিছু যোগ করে।
থমাস কামমেয়ের

3
আপনি ডেটা প্রবাহের কথা উল্লেখ করেছেন, যাতে কিছু মান আইএমএইচও যোগ করে।
রাইনার জোসভিগ

কিউএমএল এর অর্থ যা বোঝা যাচ্ছে, তা মনে হচ্ছে;)
mlvljr

3
আমার জন্য, এই উত্তরটি বোঝা সহজ ছিল, বিশেষত কারণ "অ্যাপ্লিকেশনটির মাধ্যমে রিপল" এবং "সংবেদক-জাতীয় নোডস" এর মতো প্রাকৃতিক অ্যানালগগুলি ব্যবহার করা হয়েছিল। গ্রেট!
আকসেলি পালান

1
দুর্ভাগ্যক্রমে, ম্যানচেস্টার ডেটাফ্লো মেশিনের লিঙ্কটি মারা গেছে।
প্যাক0

65

এফআরপি সম্পর্কে অনেক পৃষ্ঠাগুলি পড়ার পরে অবশেষে এফআরপি সম্পর্কে এই আলোকিত লেখার মুখোমুখি হয়েছি, শেষ পর্যন্ত এফআরপি আসলে কী সম্পর্কে তা বুঝতে পেরেছিল।

আমি হেইনিরিচ অ্যাপফেলমাস (প্রতিক্রিয়াশীল কলা লেখক) এর নীচে উদ্ধৃতি দিই।

ক্রিয়ামূলক প্রতিক্রিয়াশীল প্রোগ্রামিং এর সারাংশ কি?

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

ক্রিয়ামূলক প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের সারমর্ম হ'ল ঘোষণার সময় সম্পূর্ণরূপে একটি মানটির গতিশীল আচরণ নির্দিষ্ট করা।

উদাহরণস্বরূপ, একটি কাউন্টারের উদাহরণটি ধরুন: আপনার কাছে "উপরে" এবং "ডাউন" লেবেলযুক্ত দুটি বোতাম রয়েছে যা কাউন্টারকে বৃদ্ধি বা হ্রাস করতে ব্যবহৃত হতে পারে। অপরিহার্যভাবে, আপনি প্রথমে একটি প্রাথমিক মান নির্দিষ্ট করবেন এবং তারপরে যখনই কোনও বোতাম টিপবে তখন তা পরিবর্তন করবেন; এটার মতো কিছু:

counter := 0                               -- initial value
on buttonUp   = (counter := counter + 1)   -- change it later
on buttonDown = (counter := counter - 1)

মুল বক্তব্যটি হ'ল ঘোষণার সময়, কাউন্টারটির জন্য কেবলমাত্র প্রাথমিক মান নির্দিষ্ট করা হয়; কাউন্টারটির গতিশীল আচরণ প্রোগ্রামের বাকী অংশে অন্তর্ভুক্ত। বিপরীতে, কার্যক্ষম প্রতিক্রিয়াশীল প্রোগ্রামিং ঘোষণার সময় পুরো গতিশীল আচরণটি নির্দিষ্ট করে:

counter :: Behavior Int
counter = accumulate ($) 0
            (fmap (+1) eventUp
             `union` fmap (subtract 1) eventDown)

যখনই আপনি কাউন্টারটির গতিশীলতা বুঝতে চান, আপনাকে কেবল তার সংজ্ঞাটি দেখতে হবে। এটিতে ঘটতে পারে এমন সমস্ত কিছুই ডানদিকে প্রদর্শিত হবে। এটি অত্যাবশ্যক পদ্ধতির বিপরীতে যেখানে পরবর্তী ঘোষণাগুলি পূর্বের ঘোষিত মানগুলির গতিশীল আচরণ পরিবর্তন করতে পারে।

সুতরাং, আমার বোঝার মধ্যে একটি এফআরপি প্রোগ্রাম হল সমীকরণের একটি সেট: এখানে চিত্র বর্ণনা লিখুন

j পৃথক: 1,2,3,4 ...

fনির্ভর করে tতাই এটি বাহ্যিক উদ্দীপনা মডেল করার সম্ভাব্যতা অন্তর্ভুক্ত করে

প্রোগ্রামের সমস্ত রাজ্য ভেরিয়েবলগুলিতে আবদ্ধ হয় x_i

এফআরপি গ্রন্থাগার অন্য কথায় সময় এগিয়ে, গ্রহণ যত্ন নেয় jকরার j+1

এই সমীকরণগুলি আমি এই ভিডিওতে আরও বিস্তারিতভাবে ব্যাখ্যা করি ।

সম্পাদনা করুন:

মূল উত্তরের প্রায় 2 বছর পরে, সম্প্রতি আমি এই সিদ্ধান্তে পৌঁছেছি যে এফআরপি বাস্তবায়নের আরও একটি গুরুত্বপূর্ণ দিক রয়েছে। তাদের একটি গুরুত্বপূর্ণ ব্যবহারিক সমস্যা সমাধান করতে হবে (এবং সাধারণত করা হয়): ক্যাশে অবৈধ

x_i-S এর সমীকরণগুলি নির্ভরতা গ্রাফ বর্ণনা করে। যখন সময়ে কিছু x_iপরিবর্তন হয় jতখন অন্য সমস্ত x_i'মানগুলি j+1আপডেট করার প্রয়োজন হয় না, তাই সমস্ত নির্ভরতা পুনরায় গণনার প্রয়োজন হয় না কারণ কিছু x_i'থেকে পৃথক হতে পারে x_i

তদ্ব্যতীত, x_i-স পরিবর্তনগুলি ক্রমবর্ধমান আপডেট করা যেতে পারে। উদাহরণ হিসেবে বলা যায় এর একটি মানচিত্র অপারেশন বিবেচনা করা যাক f=g.map(_+1)Scala, যেখানে fএবং gআছে Listএর Ints। এখানে fঅনুরূপ x_i(t_j)এবং gহয় x_j(t_j)। এখন আমি যদি কোনও উপাদানকে আগে থেকে প্রস্তুত করি gতবে mapসমস্ত উপাদানগুলির জন্য ক্রিয়াকলাপ চালানো ব্যর্থ হবে g। কিছু এফআরপি বাস্তবায়ন (উদাহরণস্বরূপ রিফ্লেক্স-ফ্রিপ ) লক্ষ্য করে এই সমস্যাটি সমাধান করা। এই সমস্যাটি ইনক্রিমেন্টাল কম্পিউটিং নামেও পরিচিত

অন্য কথায়, x_iএফআরপিতে আচরণগুলি ( -র) কে ক্যাশে-এড গণনা হিসাবে বিবেচনা করা যেতে পারে। x_iযদি কিছু f_i-s পরিবর্তন হয় তবে দক্ষতার সাথে এই ক্যাশে-গুলি (দ্য-গুলি ) কে অকার্যকর ও পুনরায় সংশোধন করা এফআরপি ইঞ্জিনের কাজ ।


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

এইচটিএমএল টেম্প্লেটিং এবং লেআউট ভাষার সীমাবদ্ধতাগুলি এফআরপির উপাদানগুলি প্রকাশ করে বলে মনে হচ্ছে।

@ কনোনাল এটি আমাকে বিস্মিত করে তোলে কীভাবে ওডিডি থেকে এফআরপি আলাদা। তারা কীভাবে আলাদা?
heেগেদাস

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

29

কনাল এলিয়ট ( সরাসরি পিডিএফ , 233 কেবি) দ্বারা কাগজটি কেবল দক্ষ কার্যক্ষম ক্রিয়াশীলতা মোটামুটি ভাল ভূমিকা introduction সংশ্লিষ্ট গ্রন্থাগারও কাজ করে।

কাগজটি এখন অন্য একটি কাগজ, পুশ-পুল ফাংশনাল রিঅ্যাকটিভ প্রোগ্রামিং ( সরাসরি পিডিএফ , 286 কেবি) দ্বারা উত্তোলিত করা হয়েছে।


29

দাবি অস্বীকার: আমার উত্তরটি rx.js এর প্রসঙ্গে - জাভাস্ক্রিপ্টের জন্য একটি 'প্রতিক্রিয়াশীল প্রোগ্রামিং' লাইব্রেরি।

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

পর্যবেক্ষণযোগ্য ব্যবহারের প্রধান সুবিধাগুলি হ'ল:
i) এটি আপনার কোড থেকে রাষ্ট্র দূরে সরিয়ে দেয়, উদাহরণস্বরূপ, আপনি যদি ইভেন্ট হ্যান্ডলারটি কেবলমাত্র প্রতিটি 'এন' ইভেন্টের জন্য বরখাস্ত করতে চান বা প্রথম 'এন' ইভেন্টের পরে গুলি চালানো বন্ধ করেন, বা প্রথম 'এন' ইভেন্টের পরে গুলি চালানো শুরু করুন, আপনি কাউন্টারগুলি সেট করা, আপডেট এবং চেক করার পরিবর্তে কেবল HoFs (যথাক্রমে ফিল্টার, টেকইন্টিল, এড়িয়ে যেতে পারেন) ব্যবহার করতে পারেন।
ii) এটি কোডের স্থানীয়তার উন্নতি করে - যদি আপনার 5 টির মতো ইভেন্ট হ্যান্ডলারের কোনও উপাদানটির স্থিতি পরিবর্তন হয় তবে আপনি তাদের পর্যবেক্ষণগুলি একীভূত করতে পারেন এবং পরিবর্তে 5 টি ইভেন্ট হ্যান্ডলারকে একত্রে মিশ্রিত পর্যবেক্ষণযোগ্য একক ইভেন্ট হ্যান্ডলারটি সংজ্ঞায়িত করতে পারেন এটি এটি খুব করে তোলে আপনার পুরো সিস্টেমের ইভেন্টগুলি কোন উপাদানকে প্রভাবিত করতে পারে সে সম্পর্কে তর্ক করার সহজ, যেহেতু এটি সমস্ত একক হ্যান্ডলারের মধ্যে রয়েছে।

  • একটি পর্যবেক্ষণযোগ্য একটি Iteable এর দ্বৈত।

একটি আইটেমারেবল একটি অলসভাবে গ্রাস করা ক্রম - প্রতিটি আইটেমটি যখনই এটি ব্যবহার করতে চায় তখন পুনরুক্তি দ্বারা টানা হয়, এবং এই কারণটি গ্রাহক দ্বারা চালিত হয়।

একটি পর্যবেক্ষণযোগ্য একটি অলস উত্পাদিত ক্রম - প্রতিটি আইটেম পর্যবেক্ষকের কাছে ধাক্কা দেওয়া হয় যখনই এটি সিকোয়েন্সে যুক্ত হয়, এবং সেইজন্য অঙ্কটি প্রযোজক দ্বারা চালিত হয়।


1
একটি পর্যবেক্ষণযোগ্য এর সোজা সংজ্ঞা এবং পুনরাবৃত্তীয় থেকে তার পার্থক্য জন্য আপনাকে অনেক ধন্যবাদ । আমি মনে করি একটি সত্যিকারের উপলব্ধি অর্জনের জন্য এটি একটি জটিল ধারণাকে তার সুপরিচিত দ্বৈত ধারণার সাথে তুলনা করা বেশ সহায়ক।

2
"সুতরাং এফআরপি-র পেছনের ধারণাটি হ'ল প্রতিটি পৃথক ইভেন্ট প্রক্রিয়া করার পরিবর্তে ইভেন্টগুলির একটি স্ট্রিম তৈরি করুন (পর্যবেক্ষণযোগ্য * দিয়ে বাস্তবায়িত) এবং এর পরিবর্তে HoFs প্রয়োগ করুন।" আমার ভুল হতে পারে তবে আমি বিশ্বাস করি এটি আসলে এফআরপি নয় বরং অবজার্ভার ডিজাইনের প্যাটার্নের উপর একটি দুর্দান্ত বিমূর্ততা যা HoF (যা দুর্দান্ত!) এর মাধ্যমে ক্রিয়ামূলক ক্রিয়াকলাপের অনুমতি দেয় যখন এখনও অপরিহার্য কোড সহ ব্যবহার করার উদ্দেশ্যে। আলোচনার বিষয় - ল্যাম্বদা-the-timatemate.org/node/4982
এনকিউ

18

বাবু, এটি একটি উদ্ভট উজ্জ্বল ধারণা! 1998 এ কেন আমি এটি সম্পর্কে জানতে পারি না? যাইহোক, এখানে আমার ফ্রাঙ্ক টিউটোরিয়ালটির ব্যাখ্যা । পরামর্শগুলি সর্বাধিক স্বাগত, আমি এর ভিত্তিতে একটি গেম ইঞ্জিন শুরু করার বিষয়ে ভাবছি।

import pygame
from pygame.surface import Surface
from pygame.sprite import Sprite, Group
from pygame.locals import *
from time import time as epoch_delta
from math import sin, pi
from copy import copy

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption('Functional Reactive System Demo')

class Time:
    def __float__(self):
        return epoch_delta()
time = Time()

class Function:
    def __init__(self, var, func, phase = 0., scale = 1., offset = 0.):
        self.var = var
        self.func = func
        self.phase = phase
        self.scale = scale
        self.offset = offset
    def copy(self):
        return copy(self)
    def __float__(self):
        return self.func(float(self.var) + float(self.phase)) * float(self.scale) + float(self.offset)
    def __int__(self):
        return int(float(self))
    def __add__(self, n):
        result = self.copy()
        result.offset += n
        return result
    def __mul__(self, n):
        result = self.copy()
        result.scale += n
        return result
    def __inv__(self):
        result = self.copy()
        result.scale *= -1.
        return result
    def __abs__(self):
        return Function(self, abs)

def FuncTime(func, phase = 0., scale = 1., offset = 0.):
    global time
    return Function(time, func, phase, scale, offset)

def SinTime(phase = 0., scale = 1., offset = 0.):
    return FuncTime(sin, phase, scale, offset)
sin_time = SinTime()

def CosTime(phase = 0., scale = 1., offset = 0.):
    phase += pi / 2.
    return SinTime(phase, scale, offset)
cos_time = CosTime()

class Circle:
    def __init__(self, x, y, radius):
        self.x = x
        self.y = y
        self.radius = radius
    @property
    def size(self):
        return [self.radius * 2] * 2
circle = Circle(
        x = cos_time * 200 + 250,
        y = abs(sin_time) * 200 + 50,
        radius = 50)

class CircleView(Sprite):
    def __init__(self, model, color = (255, 0, 0)):
        Sprite.__init__(self)
        self.color = color
        self.model = model
        self.image = Surface([model.radius * 2] * 2).convert_alpha()
        self.rect = self.image.get_rect()
        pygame.draw.ellipse(self.image, self.color, self.rect)
    def update(self):
        self.rect[:] = int(self.model.x), int(self.model.y), self.model.radius * 2, self.model.radius * 2
circle_view = CircleView(circle)

sprites = Group(circle_view)
running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            running = False
    screen.fill((0, 0, 0))
    sprites.update()
    sprites.draw(screen)
    pygame.display.flip()
pygame.quit()

সংক্ষেপে: যদি প্রতিটি উপাদান একটি সংখ্যার মতো চিকিত্সা করা যায়, পুরো সিস্টেমটি গণিতের সমীকরণের মতো আচরণ করা যেতে পারে, তাই না?


1
এটি কিছুটা দেরি হলেও যাইহোক ... ফ্রেগ এফআরপি ব্যবহার করে একটি খেলা
arx

14

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

এছাড়া কি এই বই (2011 মুক্তি, আপডেট 2014) একটি নতুন লেখা দেখে মনে হচ্ছে হয়, সঙ্গীত Haskell, স্কুল


10

পূর্ববর্তী উত্তর অনুসারে, এটি গাণিতিকভাবে মনে হয়, আমরা কেবল উচ্চতর ক্রমে ভাবি। টাইপ এক্স-এর মান হওয়া x এর পরিবর্তে আমরা একটি ফাংশন x : TX সম্পর্কে ভাবি যেখানে টি সময়ের ধরণ, এটি প্রাকৃতিক সংখ্যা, পূর্ণসংখ্যা বা ধারাবাহিকতা হোক be এখন যখন আমরা প্রোগ্রামিং ভাষায় y : = x + 1 লিখি , আমরা আসলে y ( t ) = x ( t ) + 1 সমীকরণটি বোঝি


9

উল্লিখিত হিসাবে একটি স্প্রেডশিটের মত কাজ। সাধারণত একটি ইভেন্ট চালিত কাঠামোর উপর ভিত্তি করে।

সমস্ত "দৃষ্টান্তগুলির" মতোই, এটি নতুনত্ব বিতর্কযোগ্য।

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

কিছু শব্দার্থবিজ্ঞানগুলি রেফারেনশিয়াল লুপ বা সম্প্রচারকে বোঝায় বলে এড়ানো শক্ত, এবং অভিনেতাদের নেটওয়ার্ক কিছুটা অনির্দেশ্য অবস্থানে রূপান্তরিত (বা না) হওয়ার কারণে যথেষ্ট বিশৃঙ্খল হতে পারে।

একইভাবে, কয়েকটি রাজ্য সু-সংজ্ঞায়িত প্রান্ত থাকা সত্ত্বেও পৌঁছাতে পারে না, কারণ বিশ্বব্যাপী রাষ্ট্র সমাধান থেকে দূরে থাকে। 2 + 2 কখন 2 হয়ে যায় তার উপর নির্ভর করে 2 এবং 2 তারা 4 হয়ে উঠতে পারে এবং নাও থাকতে পারে they স্প্রেডশিটে সিঙ্ক্রোনাস ক্লক এবং লুপ সনাক্তকরণ রয়েছে। বিতরণ অভিনেতা সাধারণত না।

সব ভাল মজা :)।


8

আমি এফআরপি সম্পর্কে ক্লোজার সাবরেডডিতে এই দুর্দান্ত ভিডিওটি পেয়েছি। আপনি Clojure না জানলেও এটি বোঝা বেশ সহজ।

ভিডিওটি এখানে: http://www.youtube.com/watch?v=nket0K1RXU4

ভিডিওটি দ্বিতীয়ার্ধে উত্স হিসাবে উল্লেখ করা হয়েছে: https://github.com/Cicayda/yolk-example/blob/master/src/yolk_exferences/client/autocomplete.cljs


7

আন্দ্রে স্টাল্টজের এই নিবন্ধটি আমি এ পর্যন্ত দেখলাম সেরা এবং স্পষ্ট ব্যাখ্যা।

নিবন্ধ থেকে কিছু উদ্ধৃতি:

প্রতিক্রিয়াশীল প্রোগ্রামিং অ্যাসিক্রোনাস ডেটা স্ট্রিম সহ প্রোগ্রামিং করে।

তার উপরে, আপনাকে সেই স্ট্রিমগুলির একত্রিত করতে, তৈরি করতে এবং ফিল্টার করার জন্য আপনাকে ফাংশনের একটি আশ্চর্যজনক সরঞ্জামবক্স দেওয়া হবে।

নিবন্ধটির একটি অংশ যে চমত্কার চিত্রগুলির উদাহরণ এখানে রয়েছে:

ইভেন্ট স্ট্রিম চিত্রটি ক্লিক করুন


5

এটি সময়ের সাথে গাণিতিক ডেটা ট্রান্সফর্মেশনগুলি (বা সময়ের উপেক্ষা করে) সম্পর্কিত।

কোডে এর অর্থ কার্যকরী বিশুদ্ধতা এবং ঘোষিত প্রোগ্রামিং।

স্ট্যান্ড বাগগুলি স্ট্যান্ডার্ড অপরিহার্য দৃষ্টান্তে একটি বিশাল সমস্যা। কোডের বিভিন্ন বিট প্রোগ্রামগুলির সম্পাদনায় বিভিন্ন "সময়ে" সময়ে কিছু ভাগ করে নেওয়া রাষ্ট্র পরিবর্তন করতে পারে। এটি মোকাবেলা করা কঠিন।

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

এটি জটিলতা এবং ডিবাগিংয়ের সময়কে ব্যাপকভাবে হ্রাস করে।

একটি প্রোগ্রামে অঙ্কিত A = B + C এবং একটি প্রোগ্রামে A = B + C এর মধ্যে পার্থক্যের কথা চিন্তা করুন। গণিতে আপনি এমন একটি সম্পর্ক বর্ণনা করছেন যা কখনই পরিবর্তিত হয় না। একটি প্রোগ্রামে, এটি বলে যে "এই মুহূর্তে" এ হ'ল বি + সি। তবে পরবর্তী কমান্ডটি বি ++ হতে পারে যে ক্ষেত্রে A + B + C এর সমান নয়। গণিত বা ঘোষণামূলক প্রোগ্রামিং এ আপনি যে বিন্দুতে সময় জিজ্ঞাসা করবেন না কেন, সর্বদা বি + সি এর সমান হবে।

তাই ভাগ করা রাষ্ট্রের জটিলতাগুলি সরিয়ে এবং সময়ের সাথে সাথে মানগুলি পরিবর্তন করে। আপনার প্রোগ্রামটি সম্পর্কে বিতর্ক করা খুব সহজ।

একটি ইভেন্ট স্ট্রিম একটি ইভেন্ট স্ট্রিম + কিছু রূপান্তর ফাংশন।

একটি আচরণ একটি ইভেন্টস্ট্রিম + স্মৃতিতে কিছু মান।

ইভেন্টটি জ্বলে উঠলে রূপান্তর ফাংশনটি চালিয়ে মান আপডেট হয় updated এটি যে মানটি উত্পন্ন করে তা আচরণের স্মৃতিতে সঞ্চিত থাকে।

আচরণগুলি এমন নতুন আচরণ তৈরির জন্য রচিত হতে পারে যা এন অন্যান্য আচরণের রূপান্তর। এই সমন্বিত মানটি ইনপুট ইভেন্টগুলি (আচরণগুলি) ফায়ার হিসাবে পুনরায় গণনা করবে।

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

থেকে উদ্ধৃতি - পর্যবেক্ষক প্যাটার্নটি হ্রাস করা হচ্ছে


ঘোষিত প্রোগ্রামিং সম্পর্কে আমি ঠিক এইরকম অনুভব করি এবং আপনি আমার চেয়ে ধারণাটি আরও ভালভাবে বর্ণনা করেন।
nevevek

2

প্রতিক্রিয়াশীল প্রোগ্রামিং সম্পর্কে সংক্ষিপ্ত এবং স্পষ্ট ব্যাখ্যা সাইকেলেজে প্রদর্শিত হচ্ছে - প্রতিক্রিয়াশীল প্রোগ্রামিং , এটি সহজ এবং ভিজ্যুয়াল নমুনা ব্যবহার করে।

একটি [মডিউল / উপাদান / উপাদান] প্রতিক্রিয়াশীল মানে এটি বাহ্যিক ইভেন্টগুলিতে প্রতিক্রিয়া ব্যক্ত করে নিজস্ব রাষ্ট্র পরিচালনার জন্য সম্পূর্ণ দায়বদ্ধ।

এই পদ্ধতির সুবিধা কী? এটি নিয়ন্ত্রণের বিপরীততা , মূলত কারণ [মডিউল / উপাদান / উপাদান] নিজের জন্য দায়বদ্ধ, জনসাধারণের বিরুদ্ধে ব্যক্তিগত পদ্ধতি ব্যবহার করে এনক্যাপসুলেশন উন্নত করে।

এটি একটি ভাল স্টার্টআপ পয়েন্ট, জানার সম্পূর্ণ উত্স নয়। সেখান থেকে আপনি আরও জটিল এবং গভীর কাগজপত্রে ঝাঁপিয়ে যেতে পারেন।


0

.NET এর জন্য আরএক্স, প্রতিক্রিয়াশীল এক্সটেনশনগুলি দেখুন। তারা উল্লেখ করেছেন যে আইনিম্যারেবলের সাথে আপনি মূলত একটি স্ট্রিম থেকে 'টানছেন'। আইকিউয়েরেবল / আইনিউমারেবলের উপর লিনাকের প্রশ্নগুলি সেট অপারেশনগুলি সেট করে যা ফলাফলগুলি 'স্তন্যপান' করে দেয়। তবে একই অপারেটরগুলির সাথে IObservable আপনি লিঙ্ক প্রশ্নগুলি লিখতে পারেন যা 'প্রতিক্রিয়া জানায়'।

উদাহরণস্বরূপ, আপনি একটি লিনক ক্যোয়ারী লিখতে পারেন (মাই অবজার্ভেলসেটঅফমাউসগুলি থেকে এম থেকে যেখানে এমএক্স <100 এবং এমওয়াই <100 নতুন পয়েন্ট নির্বাচন করুন (এমএক্স, এমওয়াই))।

আর আর এক্স এক্সটেনশনের সাহায্যে এটি হ'ল: আপনার কাছে ইউআই কোড রয়েছে যা মাউস আন্দোলনের আগত প্রবাহকে প্রতিক্রিয়া জানায় এবং যখনই আপনি 100,100 বাক্সে থাকবেন তখনই আঁকবে ...


0

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

শুরু করতে প্রতিক্রিয়াশীল প্রোগ্রামিংয়েরে আন্দ্রে স্টাল্টজ পোস্টটি দেখুন।

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