কার্যকরী জিইউআই প্রোগ্রামিং সম্ভব? [বন্ধ]


404

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

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

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


7
কমন লিস্প এবং ওক্যামল-এ জিইউআইয়ের দিকে নজর রেখে আমি বলব, সম্ভবত, এর হাস্কেলের আলস্যতাই এই সমস্যার কারণ হয়ে দাঁড়িয়েছে।
new123456

5
@ new123456 কমন লিস্প কোনও কার্যকরী ভাষা নয় যদিও এটি মিটেবল ডেটা নিয়ে কাজ করে এবং পার্শ্ব প্রতিক্রিয়াগুলি আলিঙ্গন করে
ইলেকট্রিক কফি

3
@ ইলেক্ট্রিককফি লিস্প একটি অত্যন্ত নমনীয় ভাষা যা বিভিন্ন ধরণের শৈলীতে ব্যবহৃত হতে সক্ষম এবং অনেক লোক লিস্পকে কার্যকরী শৈলীতে ব্যবহার করতে পছন্দ করে।
ক্রিসমোম 1

7
আমার অভিজ্ঞতা থেকে (যদিও আমি এখনও এটিতে বিশ্বাস করার চেষ্টা করছি এবং আরও শিখছি) এফআরপি সত্যিই জিইউআই প্রোগ্রামিংয়ের সাথে তার সীমাতে পৌঁছেছে; এটি 80% ব্যবহারের ক্ষেত্রে সুন্দর এবং মার্জিত তবে সমৃদ্ধ উইজেটের জন্য তাদের অভ্যন্তরীণ অবস্থার খুব সুনির্দিষ্ট নিয়ন্ত্রণ প্রয়োজন (যেমন অনুসন্ধানের কম্বো বাক্সগুলি ইত্যাদি) এবং এফআরপি কেবল পথে চলে। অপরিহার্য সবসময় মন্দ হয় না; অপরিহার্য কোডটির পরিমাণ হ্রাস করার চেষ্টা করা ভাল তবে এর 100% অপসারণ করবেন? এটি এখনও অপ্রয়োজনীয় UI বিকাশের জন্য কাজ করতে দেখেনি।
আলেক্সজি

8
@ ইলেক্ট্রিককফি "প্রচলিত লিস্প যদিও কার্যকরী ভাষা নয়"। লিস্প হ'ল সমস্ত কার্যকরী ভাষার জনক। আপনার মানে লিস্প খাঁটি নয়।
জন হ্যারোপ

উত্তর:


183

হ্যাস্কেল পদ্ধতির কাছে মনে হয় কেবল আবশ্যক জিইউআই সরঞ্জামকিটগুলি জড়ান (যেমন জিটিকে + বা ডাব্লু এক্সজেডস) এবং একটি আবশ্যক শৈলী অনুকরণ করার জন্য "কর" ব্লক ব্যবহার করা হয়

এটি আসলেই "হাস্কেল অ্যাপ্রোচ" নয় - এটি একটি অত্যাবশ্যক ইন্টারফেসের মাধ্যমে - আপনি কেবলমাত্র জরুরী জিইউআই সরঞ্জামকিটগুলির সাথে সরাসরি বাঁধেন। হাস্কেল কেবল মোটামুটি বিশিষ্ট বাঁধাইয়ের ঘটনা ঘটে।

বেশিরভাগ পরিমিতরূপে পরিপক্ক, বা জিইআইআই-তে বেশিরভাগ পরীক্ষামূলক বিশুদ্ধরূপে কার্যকরী / ঘোষণামূলক পদ্ধতি রয়েছে, বেশিরভাগ হাস্কেলের মধ্যে এবং মূলত কার্যকরী প্রতিক্রিয়াশীল প্রোগ্রামিং ব্যবহার করে।

কিছু উদাহরণ হ'ল:

আপনারা যারা হাস্কেল, ফ্ল্যাপজ্যাক্সের সাথে পরিচিত নন তাদের জন্য http://www.flapjax-lang.org/ জাভাস্ক্রিপ্টের শীর্ষে কার্যকরী প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের একটি বাস্তবায়ন।


32
কৌশল এবং সিদ্ধান্তগুলির গভীর-বর্ণনার জন্য ফল সম্পর্কে কনল এলিয়টের কাগজটি দেখুন: conal.net/papers/genuinely-functional-guis.pdf আমি কয়েক মাস ধরে এই স্টাইলে খাঁটি ফাংশনাল জিইউআই প্রোগ্রামিং করছি now । আমি এটি ভালবাসি, এটি ইউপিআই প্রোগ্রামিংয়ের স্প্যাগেটি নরকের কাছ থেকে এমন একটি মনোরম স্বস্তি, যা বেশিরভাগ অপরিহার্য প্রোগ্রামিংয়ের চেয়ে এই ক্ষেত্রে আরও খারাপ বলে মনে হয়।
লুচি

44
আমি 100% এর সাথে একমত এটিকে স্ফটিক পরিষ্কার করার জন্য: বিদ্যমান জিইআইআই সরঞ্জামকিটগুলি প্রায়শই ব্যবহৃত হওয়ার কারণ হ'ল এটি বিদ্যমান। যে কারণে তাদের ইন্টারফেসগুলি অপরিহার্য এবং অপরিষ্কার প্রবণতা হ'ল এটি হ'ল কারণ সরঞ্জামদণ্ডগুলি অপরিহার্য এবং অপরিষ্কার। টুলকিটগুলি অপরিহার্য এবং অপরিষ্কার হওয়ার কারণ হ'ল কারণ যে অপারেটিং সিস্টেমগুলি তারা নির্ভর করে সেগুলি অপরিহার্য এবং অপরিষ্কার হতে থাকে। যাইহোক, মৌলিকভাবে কিছুই নেই প্রয়োজন এর মধ্যে যে কোনো অপবিত্র হতে: এই টুলকিট জন্য কার্যকরী বাইন্ডিং করুন, ক্রিয়ামূলক টুলকিট সেখানে, এমনকি কার্মিক অপারেটিং সিস্টেম আছে।
Jörg W Mittag

16
সব কিছুই কেবল অলসতার বিষয়। (খারাপ শোধ করার উদ্দেশ্যে।)
Jörg W Mittag

10
কোনও দিন সমস্ত জিইউআই ডিজাইন WYSIWYG এর মাধ্যমে কার্যকর হবে, যুক্তিটি কার্যকরীভাবে বাস্তবায়িত হবে। এটা আমার ভবিষ্যদ্বাণী।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

23
কাগজের লুচি উল্লেখ করেছে মৃত বলে মনে হচ্ছে। কনাল
জেনুইনলি- ফাংশনাল-

74

আমার প্রশ্ন হ'ল জিইআইআই প্রোগ্রামিংয়ের ক্ষেত্রে কার্যকরী দৃষ্টিভঙ্গি রাখা কি সম্ভব?

আপনি যে কী শব্দগুলির সন্ধান করছেন তা হ'ল "ফাংশনাল রিঅ্যাকটিভ প্রোগ্রামিং" (এফআরপি)।

কনাল এলিয়ট এবং আরও কয়েকজন এফআরপি-র জন্য সঠিক বিমূর্ততা সন্ধান করার চেষ্টা করে কিছুটা কুটির শিল্প তৈরি করেছে। হাস্কেলের এফআরপি ধারণাগুলির বেশ কয়েকটি বাস্তবায়ন রয়েছে।

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

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


আমি "রিঅ্যাকটিভ এক্সটেনশানস" (এফআরপি লাইব্রেরিগুলি; তবে এফপি নয়) এর ব্যবহার বৃদ্ধি করতে চাই যা মূলত সি # এর জন্য রচিত হয়েছিল এবং তারপরে জাভা (আরএক্সজাভা) এবং জাভাস্ক্রিপ্ট (আরএক্সজেএস) এবং বিভিন্ন ভাষায় পোর্ট করা হয়েছিল। অ্যাক্টিভেটিক্স.আইও পয়েন্টটি দেখুন, কৌণিক 2 RxJS এর ​​বিস্তৃত ব্যবহার করে।
srph

63

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

ডাব্লুপিএফ এক্সএএমএল-তে ইউজার ইন্টারফেসের বর্ণনা দেয় (যদিও আপনি এটি ক্রিয়ামূলকভাবে সি # বা এফ # দেখতে দেখতে আবারও লিখতে পারেন), যাতে কিছু ইউজার ইন্টারফেস তৈরি করতে আপনি লিখবেন:

<!-- Declarative user interface in WPF and XAML --> 
<Canvas Background="Black">
   <Ellipse x:Name="greenEllipse" Width="75" Height="75" 
      Canvas.Left="0" Canvas.Top="0" Fill="LightGreen" />
</Canvas>

তদ্ব্যতীত, ডাব্লুপিএফ আপনাকে ঘোষণামূলকভাবে অ্যানিমেশন এবং ইভেন্টের প্রতিক্রিয়াগুলি বিবৃতিমূলক ট্যাগের অন্য সেট ব্যবহার করে বর্ণনা করতে দেয় (আবার একই জিনিস সি # / এফ # কোড হিসাবে লেখা যেতে পারে):

<DoubleAnimation
   Storyboard.TargetName="greenEllipse" 
   Storyboard.TargetProperty="(Canvas.Left)"
   From="0.0" To="100.0" Duration="0:0:5" />

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


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

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

3
স্টিভেন পেমবার্টন এফ # এবং ডাব্লুপিএফ-তে 2 টি দুর্দান্ত পোস্ট লিখেছেন , দ্বিতীয় পোস্টের শেষের দিকে এফ # দিয়ে ডাব্লুপিএফ বিকাশের বিষয়ে তাঁর চিন্তাভাবনাগুলি এই আলোচনায় যুক্ত করেছে। 2 টি অন্যান্য উদাহরণ যা আমাকে উদ্বেগ করেছিল তা হ'ল ফ্ল্যাশ ফ্রগ কনসালটেন্সি দ্বারা ডাব্লুপিএফ নিয়ন্ত্রণ ডেমোতে একটি সাধারণ ইন্টারফেস তৈরির জন্য ইভেন্ট চালিত এমভিভিএমের একটি কার্যকরী নিয়ামক ব্যবহার এবং বৈষম্যমূলক ইউনিয়নগুলির ব্যবহার এবং পুনরাবৃত্তি were
ফান

29

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

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

let rec drawingLoop(clr, from) = async { 
   // Wait for the first MouseMove occurrence 
   let! move = Async.AwaitObservable(form.MouseMove) 
   if (move.Button &&& MouseButtons.Left) = MouseButtons.Left then 
      // Refresh the window & continue looping 
      drawRectangle(clr, from, (move.X, move.Y)) 
      return! drawingLoop(clr, from) 
   else
      // Return the end position of rectangle 
      return (move.X, move.Y) } 

let waitingLoop() = async { 
   while true do
      // Wait until the user starts drawing next rectangle
      let! down = Async.AwaitObservable(form.MouseDown) 
      let downPos = (down.X, down.Y) 
      if (down.Button &&& MouseButtons.Left) = MouseButtons.Left then 
         // Wait for the end point of the rectangle
         let! upPos = drawingLoop(Color.IndianRed, downPos) 
         do printfn "Drawn rectangle (%A, %A)" downPos upPos }

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

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


7
+1 এটি আমাদের অভিজ্ঞতা প্রতিফলিত করে, সংযুক্তকারী লাইব্রেরি এবং ব্যবহার করে এফ # তে বেশ কয়েকটি প্রোডাকশন জিইউআই লিখেছেন IObservable
জন হ্যারোপ

.NET লাইব্রেরিতে প্রতিক্রিয়াশীল এক্সটেনশন প্রবর্তনের পর থেকে কি এফআরপি সম্পর্কে মন্তব্যটি বদলেছে?
Fsharp পিট

1
অ্যারোজাইজড এফআরপি এবং আইনগুলি ভঙ্গ না করে কীভাবে প্রভাব এবং মিউটেশনকে অ্যারোজাইজড এফআরপি-র মধ্যে এম্বেড করা যেতে পারে সে সম্পর্কে এখানে কিছু গবেষণা রয়েছে: haskell.cs.yale.edu/wp-content/uploads/2015/10/… ( বিটিডব্লু বেশিরভাগ এফআরপি লাইব্রেরি মনড বা এমনকি ব্যবহার করে প্রয়োগকারীগণ, সুতরাং এটি ঠিক নয় যে তীরগুলি দরকার)
এরিক কাপলুন

17

আপনি যদি F # বা OCaml এর মতো হাইব্রিড ফাংশনাল / OO ভাষায়, বা হাস্কেলের মতো খাঁটি কার্যকরী ভাষায়, যেখানে পার্শ্ব-প্রতিক্রিয়াগুলি আইও মনাদকে দেওয়া হয়, তবে বেশিরভাগ ক্ষেত্রেই জিইউআই পরিচালনার জন্য এক টন কাজের প্রয়োজন হয় it's খাঁটি ফাংশনাল অ্যালগরিদমের চেয়ে অনেক বেশি "পার্শ্ব প্রতিক্রিয়া" এর মতো।

তাই বলা হয়, সেখানে মধ্যে কিছু সত্যিই কঠিন গবেষণা রাখা হয়েছে কার্মিক GUIs । এমনকি কিছু (বেশিরভাগ) ফাংশনাল টুলকিট যেমন ফুজেটস বা ফ্রাঙ্কটেক রয়েছে



15

আপনি ডন সাইমে এফ # তে সিরিজটি পরীক্ষা করে দেখতে পারেন যেখানে তিনি একটি গি তৈরি করেছেন। নিম্নলিখিত লিঙ্কটি সিরিজের তৃতীয় অংশের (আপনি সেখান থেকে অন্য দুটি অংশে লিঙ্ক করতে পারেন)।

ডাব্লুপিএফ উন্নয়নের জন্য এফ # ব্যবহার করা খুব আকর্ষণীয় জিইউআই দৃষ্টান্ত হবে ...

http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to-F-3-of-3/


12

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

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

http://www.cs.nott.ac.uk/~nhn/Talks/HW2003-YampaArcade.pdf (স্লাইডস, পিডিএফ) http://www.cs.nott.ac.uk/~nhn/ প্রজাতন্ত্র / hw2003। পিডিএফ (পুরো নিবন্ধ, পিডিএফ)

হাস্কেল.আর.গ্রে ইয়াম্পায় একটি উইকি পৃষ্ঠা রয়েছে

http://www.haskell.org/haskellwiki/Yampa

আসল ইয়াম্পা হোম পৃষ্ঠা:

http://www.haskell.org/yampa (দুর্ভাগ্যক্রমে এই মুহুর্তে ভেঙে গেছে)


1
সেই লিঙ্কটি দীর্ঘদিন ধরে ভেঙে গেছে। এই Yampa
CoR

7

যেহেতু এই প্রশ্নটি প্রথম জিজ্ঞাসা করা হয়েছিল, কার্যকরী প্রতিক্রিয়াশীল প্রোগ্রামিংকে এলম কিছুটা মূলধারায় পরিণত করেছে।

আমি এটি http://elm-lang.org এ যাচাই করার পরামর্শ দিচ্ছি , যার মধ্যে ব্রাউজার জিইউআই সম্পূর্ণরূপে কার্যকরী করার বিষয়ে কিছু সত্যিকারের দুর্দান্ত ইন্টারেক্টিভ টিউটোরিয়াল রয়েছে।

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



6

এফআরপিতে এলিয়টের আলাপ এখানে পাওয়া যাবে

তদ্ব্যতীত, সত্যই কোনও উত্তর নয় বরং একটি মন্তব্য এবং কয়েকটি চিন্তা : কোনওভাবে "ফাংশনাল জিইউআই" শব্দটি অক্সিমোরনের মতোই মনে হয় (একই শব্দে বিশুদ্ধতা এবং আইও)।

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

অন্য কথায়, এই ফাংশনটি পৃথকীকরণের সমীকরণের মতো ঘোষিত হিসাবে সংজ্ঞায়িত করা হয়, পরিবর্তে পরিবর্তনীয় স্থিতি ব্যবহার করে অ্যালগরিদম দ্বারা আবশ্যক।

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

আসুন আমরা একটি বসন্তে একটি বল অনুকরণ সম্পর্কে চিন্তা করি যা ব্যবহারকারীর সাথে যোগাযোগ করতে পারে। বলের অবস্থানটি গ্রাফিকাল আউটপুট (স্ক্রিনে) হয়, ব্যবহারকারী বলটি চাপছেন এটি একটি কী (চাপ) রয়েছে (ইনপুট)।

এফআরপিতে এই সিমুলেশন প্রোগ্রামটি বর্ণনা করা (আমার বোঝাপড়া অনুসারে) একটি একক ডিফারেনশিয়াল সমীকরণ দ্বারা ঘোষণা করা হয় (ঘোষণামূলকভাবে): ত্বরণ * ভর = - বসন্তের প্রসারিত * বসন্তের ধ্রুবক + ব্যবহারকারীর দ্বারা ব্যবহৃত শক্তি Force

এখানে ইএলএম- তে একটি ভিডিও রয়েছে যা এই দৃষ্টিকোণটিকে চিত্রিত করে।


5

২০১ of সালের হিসাবে, হাস্কেলের যেমন সোডিয়াম এবং রিফ্লেক্স (তবে নেটওয়াইর) এর জন্য আরও বেশ কয়েকটি তুলনামূলকভাবে পরিপক্ক এফআরপি ফ্রেমওয়ার্ক রয়েছে।

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

অ্যারোজাইজড এফআরপি সম্পর্কিত একটি সাম্প্রতিক কাগজও রয়েছে এবং আইনের অধীনে আইও এবং মিউটেশন অন্তর্ভুক্ত করার সম্ভাবনা, খাঁটি এফআরপি সেটিং: http://haskell.cs.yale.edu/wp-content/uploads/2015/10/ dwc-yale-formatted-dissertation.pdf

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


সোডিয়ামের
গিথুব রিডমে

4

এক্স ইউ এল এর মতো মার্কআপ ল্যাঙ্গুয়েজ আপনাকে ঘোষণামূলক উপায়ে জিইউআই তৈরি করতে দেয়।


3

এর সমাধানের জন্য আমি এফ # ব্যবহার করে আমার কিছু চিন্তা পোস্ট করেছি,

http://fadsworld.wordpress.com/2011/04/13/f-in-the-enterprise-i/ http://fadsworld.wordpress.com/2011/04/17/fin-the-enterprise-ii- 2 /

আমি সিরিজটি শেষ করতে একটি ভিডিও টিউটোরিয়াল করার পরিকল্পনা করছি এবং ইউএক্স প্রোগ্রামিংয়ে কীভাবে F # অবদান রাখতে পারে তা দেখানোর জন্য

আমি এখানে কেবল # F এর প্রসঙ্গে কথা বলছি।

-Fahad


2

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

-- | Play a game in a window. Like `simulate`, but you manage your own input events.
play    :: Display              -- ^ Display mode.
        -> Color                -- ^ Background color.
        -> Int                  -- ^ Number of simulation steps to take for each second of real time.
        -> world                -- ^ The initial world.
        -> (world -> Picture)   -- ^ A function to convert the world a picture.
        -> (Event -> world -> world)    
                -- ^ A function to handle input events.
        -> (Float -> world -> world)
                -- ^ A function to step the world one iteration.
                --   It is passed the period of time (in seconds) needing to be advanced.
        -> IO ()

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


1

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

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

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

কার্যকরী উপায়ে অ্যাসিঙ্ক্রোনাস আইও করার একটি জনপ্রিয় দর্শনকে ফাংশনাল রিঅ্যাকটিভ প্রোগ্রামিং (এফআরপি) বলা হয়। এটি সম্প্রতি রিঅ্যাকটিভএক্সের মতো লাইব্রেরি এবং এলমের মতো ফ্রেমওয়ার্কগুলিকে ধন্যবাদ, অশুচি, অ-কার্যকরী ভাষাতে প্রচুর পরিমাণে চিহ্নিত করে । সংক্ষেপে, এটি জিইউআই উপাদানগুলি দেখার মতো এবং অন্যান্য বিষয়গুলি (যেমন ফাইল, ক্লক, অ্যালার্ম, কীবোর্ড, মাউস) ইভেন্ট উত্স হিসাবে দেখা হয়, "অবজারভেবল" নামে পরিচিত, যা ইভেন্টগুলির প্রবাহকে নির্গত করে। এই ইভেন্টগুলি পরিচিত অপারেটর ব্যবহার করে যেমন একত্রিত করা হয় map, foldl, zip, filter, concat, join, ইত্যাদি, নতুন স্ট্রিম উত্পাদন করতে। এটি কার্যকর কারণ প্রোগ্রামটি রাষ্ট্র হিসাবে নিজেই প্রোগ্রাম হিসাবে দেখা যায় scanl . map reactToEvents $ zipN <eventStreams>, যেখানে প্রোগ্রামটি Nকখনও বিবেচনা করা যায় এমন পর্যবেক্ষণের সংখ্যার সমান।

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


-22

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


25
আমি মনে করি আপনি এই বিষয়টিকে ভুল বুঝেছেন: এটি এমন নয় যে কার্যকরী প্রোগ্রামিংয়ের বিশ্বে কোনও বাহ্যিক প্রভাব নেই - যা সমস্ত প্রোগ্রামকে সম্পূর্ণ অকেজো করে দেবে! পরিবর্তে, কার্যকরী প্রোগ্রামিং আপনাকে আইওকে আলাদা করতে দেয় যাতে আপনি জানতে পারেন কোন বিট এটি ব্যবহার করে এবং কোন বিটগুলি ব্যবহার করে না।
টিখন জেলভিস

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