তীরের উদ্দেশ্য কী?


62

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

আমি কার্যকরী প্রোগ্রামিং ভাষায় তীরগুলির লক্ষ্য জানতে চাই। তারা কোন সমস্যার সমাধান করবেন? আমি http://en.wikibooks.org/wiki/Haskell/Unders સમજ_ arrows এবং http://www.cse.chalmers.se/~rjmh/afp-arrows.pdf পরীক্ষা করেছি । আমি কেবল বুঝতে পারি যে তারা গণনাগুলির জন্য গ্রাফগুলি বর্ণনা করতে ব্যবহৃত হয় এবং তারা সহজ বিন্দু ফ্রি স্টাইল কোডিংয়ের অনুমতি দেয়।

নিবন্ধটি অনুমান করে যে বিন্দু মুক্ত শৈলী সাধারণত বুঝতে এবং লিখতে সহজ হয়। এটা আমার কাছে বেশ সাবজেক্টিভ মনে হচ্ছে। অন্য একটি নিবন্ধে ( http://en.wikibooks.org/wiki/Haskell/StephensArrowTutorial# হ্যাঙ্গম্যান :_ মেইন_প্রগ্রাম ) একটি হ্যাঙ্গম্যান গেম বাস্তবায়িত হয়েছে, তবে তীরগুলি কীভাবে এই বাস্তবায়নটিকে প্রাকৃতিক করে তোলে তা আমি দেখতে পাচ্ছি না।

ধারণাটি বর্ণনা করার মতো অনেকগুলি কাগজ পেয়েছি, তবে অনুপ্রেরণা সম্পর্কে কিছুই নেই।

আমি কী মিস করছি?

উত্তর:


42

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

প্রথমত, আপনি তীরের কাছে না গিয়েই হাস্কেলের বেশিরভাগ সমস্যা উত্পাদনশীলভাবে সমাধান করতে পারেন। কিছু উল্লেখযোগ্য হাস্কেল্লার সত্যিকার অর্থে তাদের পছন্দ করে না এবং ব্যবহার করে না ( এখানে আরও দেখুন , এখানে , এবং এখানে দেখুন)। সুতরাং আপনি যদি নিজেকে বলে থাকেন "আরে, আমার এগুলির দরকার নেই", বুঝতে পারছেন যে আপনি সত্যই সঠিক হতে পারেন।

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

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

এফআরপি সিস্টেমে তীরগুলি যা অনুমতি দেয় তা হ'ল একটি নেটওয়ার্কে ফাংশনগুলির সংমিশ্রণ এবং একই সাথে সেই ফাংশনগুলি দ্বারা পাস করা অন্তর্নিহিত মানগুলির কোনও রেফারেন্স সম্পূর্ণরূপে বিমূর্ত করে দেয়। আপনি যদি এফপিতে নতুন হন তবে এটি প্রথমে বিভ্রান্তিকর হতে পারে, এবং তারপরে এর প্রভাবগুলি শুষে নেওয়ার পরে মন-উদ্দীপক হতে পারে। আপনি শুধুমাত্র সম্প্রতি ধারণা যে ফাংশন আনমনা যাবে শোষিত করেছি, এবং কিভাবে মত একটি তালিকা বুঝতে [(*), (+), (-)]যেমন ধরনের হচ্ছে [(a -> a -> a)]। তীরগুলির সাহায্যে আপনি বিমূর্ততাটিকে আরও একটি স্তর এগিয়ে নিয়ে যেতে পারেন।

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

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

দ্রষ্টব্য: আমি উপরে উল্লিখিত হিসাবে, আমি একটি আপেক্ষিক নুব। আমি যদি উপরের কোনও ভুল ধারণা প্রচার করে থাকে তবে দয়া করে আমাকে সংশোধন করতে দ্বিধা বোধ করবেন।


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

যদিও তীরগুলি অবশ্যই আপনার লিঙ্কযুক্ত সমাধানের জন্য ভুল হাতিয়ার, তবুও আমার মনে হয় যে removeAt' n = arr(\ xs -> (xs,xs)) >>> arr (take (n-1)) *** arr (drop n) >>> arr (uncurry (++)) >>> returnAএটি উল্লেখ করার দরকার যা আরও সংক্ষিপ্ত এবং স্পষ্টভাবে লিখিত হতে পারে removeAt' n = (arr (take $ n-1) &&& arr (drop n)) >>> (arr $ uncurry (++))
cemper93

29

এটি এক ধরণের "নরম" উত্তর, এবং আমি নিশ্চিত নই যে কোনও রেফারেন্স আসলে এই পদ্ধতিতে এটি বর্ণনা করেছে কিনা, তবে আমি তীর সম্পর্কে এইভাবে ভাবতে এসেছি:

একটি তীরের ধরনটি A b cমূলত একটি ফাংশন b -> cতবে একইভাবে আরও কাঠামোর সাথে যেমন একটি মনডিক মানটি M aএকটি সমতল পুরাতনের চেয়ে আরও কাঠামোযুক্ত থাকে a

এখন সেই অতিরিক্ত কাঠামোটি কী ঘটবে তা নির্ভর করে আপনি যে নির্দিষ্ট তীর উদাহরণটির কথা বলছেন তার উপর। ঠিক যেমন মোনাদাদের সাথে IO aএবং Maybe aপ্রত্যেকের আলাদা আলাদা কাঠামো রয়েছে।

যে কাজটা আপনি monads সঙ্গে পেতে একটি থেকে যান একটি অক্ষমতা M aএকটি থেকে a। এখন এটি একটি সীমাবদ্ধতার মতো মনে হতে পারে তবে এটি আসলে একটি বৈশিষ্ট্য: টাইপ সিস্টেমটি আপনাকে কোনও একক মানকে একটি সাধারণ পুরানো মান হিসাবে রূপান্তর করা থেকে রক্ষা করছে। আপনি কেবল মানডের মাধ্যমে >>=বা বিশেষ মোনাডের উদাহরণের আদিম ক্রিয়াকলাপের মাধ্যমে মনোডে অংশ নিয়েই মানটির ব্যবহার করতে পারেন ।

তেমনিভাবে আপনি যে জিনিসটি পান A b cতা হ'ল নতুন বি-গ্রাহক সি-প্রযোজনা "ফাংশন" তৈরি করতে অক্ষমতা। বিভিন্ন তীর সংযোজকগুলিতে অংশ নেওয়া বা নির্দিষ্ট তীরের উদাহরণের আদিম ক্রিয়াকলাপগুলি ব্যবহার করে তীরটি আপনাকে গ্রাস করা bএবং তৈরি করা থেকে সুরক্ষা cদিচ্ছে।

উদাহরণস্বরূপ ইয়াম্পায় সিগন্যাল ফাংশনগুলি মোটামুটিভাবে হয় (Time -> a) -> (Time -> b)তবে অতিরিক্তভাবে তাদের একটি নির্দিষ্ট কার্যকারিতা বিধিনিষেধ মেনে চলতে হয় : সময়ে আউটপুট tইনপুট সিগন্যালের অতীত মানগুলি দ্বারা নির্ধারিত হয়: আপনি ভবিষ্যতের দিকে তাকাতে পারবেন না। সুতরাং তারা যা করে তা হ'ল প্রোগ্রামিংয়ের পরিবর্তে (Time -> a) -> (Time -> b)আপনি প্রোগ্রাম করে SF a bএবং আপনি আপনার সিগন্যাল ফাংশনগুলি আদিমতার বাইরে তৈরি করেন। এটি ঘটে যায় যেহেতু SF a bঅনেকটা একটি ফাংশনের মতো আচরণ করে, তাই সাধারণ কাঠামোটিকে "তীর" বলা হয়।


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

14

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

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

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

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

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

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

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


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

3

অন্যান্য উত্তরের সাথে কেবল একটি সংযোজন: ব্যক্তিগতভাবে এ জাতীয় ধারণাটি (গণিত) কী এবং এটি আমার জানা অন্যান্য ধারণার সাথে কীভাবে সম্পর্কিত তা বুঝতে আমাকে অনেক বেশি সহায়তা করে।

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

এছাড়াও আমি বিশ্বাস করি যে এই লিঙ্কটি কেউ উল্লেখ করেনি যা আপনাকে এই বিষয়ে কিছু ধারণা এবং সাহিত্য সরবরাহ করতে পারে।

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