ইমপ্রিয়টিভের বিপরীতে ক্রিয়ামূলক প্রোগ্রামিং ভাষাগুলিকে কী ঘোষণামূলক করে তোলে?


17

ফাংশনাল প্রোগ্রামিংয়ের সুবিধাগুলি বর্ণনা করে অনেক নিবন্ধগুলিতে, আমি হাস্কেল, এমএল, স্কেলা বা ক্লোজারের মতো কার্যকরী প্রোগ্রামিং ভাষা দেখেছি, সি / সি ++ / সি # / জাভা এর মতো অপরিহার্য ভাষাগুলি থেকে পৃথক "ঘোষিত ভাষাগুলি" হিসাবে পরিচিত। আমার প্রশ্নটি হ'ল প্রয়োজনীয় ক্রিয়াকলাপের ভাষাগুলি ঘোষণামূলক করে তোলে।

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

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

হালনাগাদ:

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

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


আপনার যখন দরকার হয় @ জিমিহফা কোথায়?

2
1. সি # এবং আধুনিক সি ++ খুব কার্যকরী ভাষা। ২. এসকিউএল লেখার পার্থক্যের কথা চিন্তা করুন, এবং জাভা একইরকম উদ্দেশ্য অর্জন করতে (সম্ভবত কিছু জটিল প্রশ্নের সাথে যোগ দেয়)। আপনি আরও ভাবতে পারেন যে সি # তে
লিনিক্যু কীভাবে

স্পষ্টভাবে সংজ্ঞায়িত কিছুর চেয়েও ভিন্নতা শৈলীর বিষয় ... যদি আপনি
প্রলোগটি

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

1
দুর্ভাগ্যক্রমে এমনকি অ্যাসাইনমেন্ট অপারেটর ছাড়াও আমি এটি করতে পারি (let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))(আশা করি আপনি এটি বুঝতে পেরেছেন, ক্লোজার)। আমার আসল প্রশ্নটি হ'ল x = 1; x += 2; x *= x; return x;এটি আমার মতামত থেকে একে একে আলাদা করে তোলে যা বেশিরভাগই একই রকম।
ALXGTV

উত্তর:


16

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

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

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

যাইহোক, পথ Haskell, প্রোগ্রাম লেখা হয়, তারা ঘন ঘন করতে বুদ্ধিমানের যেমন ফলাফলের একটি বিবরণ নির্ণিত করা পড়া যেতে। উদাহরণস্বরূপ, প্রথম এন ফ্যাকটোরিয়ালগুলির যোগফল গণনা করার জন্য প্রোগ্রামটি ধরুন:

sum_of_fac n = sum [product [1..i] | i <- ..n]

আপনি এটি ডিজুগার করতে পারেন এবং এটি এসটিজি অপারেশনগুলির ক্রম হিসাবে পড়তে পারেন, তবে ফলাফলের বিবরণ হিসাবে এটি পড়ার চেয়ে বেশি প্রাকৃতিক বিষয়টি (যা আমি মনে করি, "কি গণনা করব" এর চেয়ে বেশি ঘোষণামূলক প্রোগ্রামিংয়ের আরও কার্যকর সংজ্ঞা): ফলাফলটি = 0,…, এন এর [1..i]সকলের যোগফল i। এবং এটি প্রায় কোনও সি প্রোগ্রাম বা ফাংশনের চেয়ে অনেক বেশি ঘোষণামূলক।


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

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

6
@ এএলএক্সজিটিভি ফাংশনাল প্রোগ্রামিং হ'ল একেবারে আলাদা দৃষ্টান্ত, এমনকি যদি আপনি এটিকে আবশ্যক হিসাবে পড়তে দৃ ad় হন (এটি একটি বিস্তৃত শ্রেণিবিন্যাস, এর চেয়ে আরও অনেক বেশি প্রোগ্রামিং উপমা রয়েছে) is এবং অন্য কোডটির এই কোডের উপর তৈরী করে যে declaratively খুব পড়া যেতে পারে: উদাহরণস্বরূপ, map (sum_of_fac . read) (lines fileContent)। অবশ্যই এক পর্যায়ে I / O খেলাতে আসে তবে যেমনটি আমি বলেছিলাম এটি একটি ধারাবাহিকতা। হাস্কেল প্রোগ্রামের অংশগুলি আরও আবশ্যকীয়, নিশ্চিত, ঠিক যেমন সি-এর একটি বাছাই-ঘোষণামূলক এক্সপ্রেশন সিনট্যাক্স রয়েছে ( x + yনা load x; load y; add;)

1
@ এলএক্সজিটিভি আপনার অন্তর্দৃষ্টি সঠিক: ঘোষিত প্রোগ্রামিং "স্রেফ" নির্দিষ্ট আবশ্যক বিশদগুলির তুলনায় উচ্চ মাত্রার বিমূর্ততা সরবরাহ করে। আমি যুক্তি দিতে পারি যে এটি একটি বড় ব্যাপার!
আন্দ্রেস এফ।

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

21

একটি অত্যাবশ্যক প্রোগ্রামের প্রাথমিক ইউনিটটি হল বিবৃতি । পার্শ্ব প্রতিক্রিয়াগুলির জন্য বিবৃতিগুলি কার্যকর করা হয়। তারা প্রাপ্ত রাষ্ট্রটিকে তারা পরিবর্তন করে। বিবৃতিগুলির ক্রম হ'ল কমান্ডের অনুক্রম, এটি এটি করে তা বোঝান ot প্রোগ্রামার গণনা সম্পাদনের সঠিক অর্ডার নির্দিষ্ট করে। এটি কম্পিউটারকে কীভাবে এটি করতে হবে তা বোঝাতেই এটি বোঝায় ।

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

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


1
এটিতে যদি একটি উদাহরণ থাকে তবে এটি একটি নিখুঁত উত্তর হবে। ঘোষণামূলক বনামকে আবশ্যকীয়ভাবে বর্ণনা করার জন্য আমি যে সর্বোত্তম উদাহরণটি জানি তা হ'ল লিনক বনাম foreach
রবার্ট হার্ভে

7

আবশ্যক প্রোগ্রামিং থেকে ঘোষককে পৃথককারী আসল সংজ্ঞাযুক্ত বৈশিষ্ট্য হ'ল ঘোষণামূলক শৈলীতে আপনি ক্রমযুক্ত নির্দেশনা দিচ্ছেন না; নিম্ন স্তরে হ্যাঁ সিপিইউ এইভাবে পরিচালনা করে তবে এটি সংকলকটির উদ্বেগ।

আপনি সিএসএসকে একটি "ঘোষিত ভাষা" হিসাবে সুপারিশ করেন, আমি একে একে ভাষা বলব না। এটি JSON, XML, CSV বা INI এর মতো একটি ডেটা স্ট্রাকচার ফর্ম্যাট, যা কিছু প্রকৃতির দোভাষীর কাছে পরিচিত ডেটা সংজ্ঞায়নের জন্য একটি ফর্ম্যাট।

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

একটি ফাংশনে অ্যাসাইনমেন্ট অপারেটরের সাথে আপনি কী করবেন? আপনি মধ্যবর্তী পদক্ষেপ তৈরি করুন। এটি এর ক্রুস, অ্যাসাইনমেন্ট অপারেটরটি ধাপে ধাপে ফ্যাশনে ডেটা পরিবর্তন করতে ব্যবহৃত হয়। যত তাড়াতাড়ি আপনি আর ডেটা পরিবর্তন করতে পারবেন না, আপনি এই সমস্ত পদক্ষেপ হারিয়ে ফেলবেন এবং এতে শেষ করবেন:

প্রতিটি ফাংশনের একটি মাত্র বিবৃতি থাকে, এই বিবৃতিটি একক ঘোষণা being

একক বিবৃতিটিকে অনেক বক্তব্যের মতো দেখতে এখন অনেকগুলি উপায় রয়েছে তবে এটি কেবল কৌতুকপূর্ণ, উদাহরণস্বরূপ: 1 + 3 + (2*4) + 8 - (7 / (8*3))এটি স্পষ্টতই একটি বিবৃতি, তবে আপনি যদি এটি লিখেন ...

1 +
3 +
(
  2*4
) +
8 - 
(
  7 / (8*3)
)

এটি অপারেশনগুলির ক্রমটির উপস্থিতি গ্রহণ করতে পারে যা মস্তিষ্কের পক্ষে লেখক যে ইচ্ছাটি ক্ষয় করতে চেয়েছিল তা পছন্দ করা সহজ হতে পারে। আমি প্রায়শই সি # তে কোডের মতো কোড দিয়ে এটি করি ..

people
  .Where(person => person.MiddleName != null)
  .Select(person => person.MiddleName)
  .Distinct();

এটি একক বিবৃতি, তবে অনেকের মধ্যে পচে যাওয়ার উপস্থিতি প্রদর্শন করে - লক্ষ্য করুন কোনও অ্যাসাইনমেন্ট নেই।

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

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

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

sum xs = (head xs) + sum (tail xs)

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


আপনার উত্তর থেকে আমি যেভাবে বুঝতে পেরেছি তা হ'ল শুদ্ধ কার্যকরী প্রোগ্রামিংয়ে পুরো প্রোগ্রামটি অনেকগুলি একক-এক্সপ্রেশন ফাংশন দ্বারা গঠিত হয়, যখন অপরিহার্য প্রোগ্রামিং ফাংশনগুলিতে (পদ্ধতিগুলি) অপারেশনের একটি নির্ধারিত ক্রম সহ একাধিক এক্সপ্রেশন থাকে
ALXGTV

1 + 3 + (2 * 4) + 8 - (7 / (8 * 3)) এটি আসলে একাধিক বিবৃতি / অভিব্যক্তি, অবশ্যই এটি আপনি একটি একক অভিব্যক্তি হিসাবে দেখেন তার উপর নির্ভর করে। এটির সংক্ষিপ্তসারটি হল মূলত সেমিকোলন ছাড়াই প্রোগ্রামিং করা।
ALXGTV

1
@ এএলএক্সজিটিভি সেই ঘোষণাপত্র এবং একটি অপরিহার্য শৈলীর মধ্যে পার্থক্য হ'ল যদি সেই গাণিতিক প্রকাশটি বিবৃতি হত তবে তাদের লিখিতভাবে সম্পাদন করা জরুরী হবে। তবে এটি আবশ্যকীয় বিবৃতিগুলির ক্রম নয়, বরং এমন একটি অভিব্যক্তি যা আপনি যা চান তা সংজ্ঞায়িত করে, কারণ এটি কীভাবে বলেন না , এটি লিখিত হিসাবে কার্যকর করা জরুরী নয়। অতএব সংকলনটি আক্ষরিক হিসাবে ভাবগুলি হ্রাস করতে পারে বা স্মৃতিচারণও করতে পারে। অপরিহার্য ভাষাগুলি এটিও করে তবে আপনি যখন এটি একটি বিবৃতিতে রেখে থাকেন; একটি ঘোষণা
জিমি হোফা

@ এএলএক্সজিটিভি ঘোষণাগুলি সম্পর্কের সংজ্ঞা দেয়, সম্পর্ক হ'ল; যদি x = 1 + 2তবে x = 3এবং x = 4 - 1। সিকোয়েন্সড স্টেটমেন্টগুলি নির্দেশিকাগুলি সংজ্ঞায়িত করে তাই যখন x = (y = 1; z = 2 + y; return z;)আপনার আর কিছু ক্ষয়যোগ্য না থাকে, সংকলক একাধিক উপায়ে কিছু করতে পারে - বরং কম্পাইলারটি সেখানে নির্দেশিত কাজটি করাই বাধ্যতামূলক, কারণ সংকলক আপনার নির্দেশাবলীর সমস্ত পার্শ্ব প্রতিক্রিয়া জানতে পারে না তাই এটি করতে পারে ' তাদের পরিবর্তন করুন।
জিমি হোফা

আপনার একটি সুস্পষ্ট পয়েন্ট আছে।
ALXGTV 26'15

6

আমি জানি আমি পার্টিতে দেরি করে ফেলেছি, তবে অন্য দিন আমার কাছে এপিফানি ছিল তাই এখানে চলে ...

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

আসুন সহজ কোডটি a = b + cএকটি ভিত্তি হিসাবে গ্রহণ করি এবং ধারণাটি পেতে কয়েকটি ভিন্ন ভাষায় বিবৃতিটি দেখুন:

যখন আমরা লিখতে a = b + cএকটি অনুজ্ঞাসূচক ভাষায়, সি মতো আমরা বরাদ্দ করা হয় বর্তমান মূল্য b + cপরিবর্তনশীল aএবং কিছুই। আমরা কী তা নিয়ে কোনও মৌলিক বক্তব্য দিচ্ছি না a। বরং আমরা কেবল একটি প্রক্রিয়াতে একটি পদক্ষেপ সম্পাদন করছি।

যখন আমরা লিখতে a = b + cএকটি ঘোষণামূলক ভাষায়, মাইক্রোসফট এক্সেল মত, (হ্যাঁ, এক্সেল হয় আমরা একটি প্রোগ্রামিং ভাষা এবং সম্ভবত তাদের সব সবচেয়ে ঘোষণামূলক,) একটি সম্পর্ক দাবী মধ্যে a, bএবং cযেমন যে এটা সবসময় ক্ষেত্রে যে aএর সমষ্টি অন্য দুটি. এটি কোনও প্রক্রিয়ার কোনও পদক্ষেপ নয়, এটি আক্রমণকারী, গ্যারান্টি, সত্যের ঘোষণা।

ক্রিয়ামূলক ভাষাগুলি পাশাপাশি ঘোষিত, তবে প্রায় দুর্ঘটনাক্রমে। উদাহরণস্বরূপ হাস্কলে a = b + cএকটি অবিস্মরণীয় সম্পর্ককেও দৃser়ভাবে জোর দেয় , তবে কেবল কারণ bএবং cতা স্থাবর হয়।

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


0

আপনি ঠিক বলেছেন যে কম্পিউটারটি কী করবে এবং কীভাবে এটি করা যায় তার মধ্যে কোনও স্পষ্ট পার্থক্য নেই ।

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

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

হাস্কেল, ওটিওএইচের মতো ল্যাঙ্গুগায় স্মৃতি সম্পূর্ণরূপে দূরে চলে যায়। এটি কেবল যে ক্ষেত্রে হয় না

f a b = let y = sum [a..b] in y*y

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

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

আমার জন্য একটি খাঁটি ঘোষিত ভাষাগুলি এমন হবে যা কেবলমাত্র ঘোষণার মধ্যে অন্তর্ভুক্ত

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


আমি বলিনি যে ফাংশনাল প্রোগ্রামিং সি তে প্রোগ্রামিং থেকে আলাদা নয়, বাস্তবে আমি বলেছিলাম যে হাস্কেলের মতো ভাষাগুলি সি এর চেয়ে অনেক বেশি উচ্চ স্তরে রয়েছে এবং আরও বিমূর্ততার প্রস্তাব দেয়।
ALXGTV 18
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.