ক্রিয়ামূলক প্রোগ্রামিং ভাষা কীভাবে কাজ করে?


92

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

উদাহরণস্বরূপ: কীভাবে এই সাধারণ সি জিনিসটি হ্যাস্কেলের মতো ক্রিয়ামূলক প্রোগ্রামিং ভাষায় অনুবাদ করবে?

#include<stdio.h>
int main() {
    int no;
    scanf("%d",&no);
    return 0;
}

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



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

14
এসপিজে কি সেখানে পার্শ্ব প্রতিক্রিয়া নিয়ে কথা বলছিল না, রাষ্ট্র নয়? খাঁটি গণনাগুলির আর্গুমেন্ট বাইন্ডিংগুলিতে এবং কল স্ট্যাকের সাথে প্রচুর পরিমাণে রাষ্ট্রীয় অন্তর্নিহিত থাকে তবে পার্শ্ব প্রতিক্রিয়া ছাড়াই (যেমন, আই / ও) কার্যকর কিছু করতে পারে না। দুটি পয়েন্ট সত্যই আলাদা স্বতন্ত্র - এখানে প্রচুর খাঁটি, রাষ্ট্রীয় হাস্কেল কোড রয়েছে এবং Stateমোনাদটি খুব মার্জিত; অন্যদিকে IOএকটি কুরুচিপূর্ণ, নোংরা হ্যাকটি কেবল হিংস্রভাবে ব্যবহৃত হয়।
সিএ ম্যাকক্যান 21

4
ক্যামক্যান ঠিক আছে। কার্যকরী ভাষাতে প্রচুর রাষ্ট্র রয়েছে। অপরিহার্য ভাষাগুলির মতো এটি "দূরত্বে ভুতুড়ে পদক্ষেপের" পরিবর্তে এটি স্পষ্টভাবে পরিচালিত হয়েছে।
আমার সঠিক মতামতটি

4
এখানে কিছুটা বিভ্রান্তি থাকতে পারে। সম্ভবত কম্পিউটারগুলি কার্যকর হওয়ার জন্য প্রভাবগুলির প্রয়োজন, তবে আমি মনে করি এখানে প্রশ্ন কম্পিউটার নয়, প্রোগ্রামিং ভাষা সম্পর্কিত।
কনল 21

উত্তর:


80

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

আপনি জড়ো হওয়ার সাথে সাথে ক্রিয়ামূলক প্রোগ্রামিংয়ের স্টেট থাকে না। তবে এর অর্থ এই নয় যে এটি ডেটা সঞ্চয় করতে পারে না। পার্থক্যটি হ'ল আমি যদি লাইনের পাশাপাশি একটি (হাস্কেল) বিবৃতি লিখি

let x = func value 3.14 20 "random"
in ...

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

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

main :: IO ()
main = do str <- getLine
          let no = fst . head $ reads str :: Integer
          ...

এটি আমাদের জানায় যে mainএটি একটি আইও ক্রিয়া যা কোনও কিছুই প্রত্যাবর্তন করে না; এই অ্যাকশনটি কার্যকর করা হ্যাসেল প্রোগ্রাম চালানোর অর্থ। নিয়মটি হল যে আইও প্রকারগুলি কখনই আইও ক্রিয়া থেকে বাঁচতে পারে না; এই প্রসঙ্গে, আমরা ব্যবহার করে সেই ক্রিয়াটি প্রবর্তন করি do। সুতরাং, getLineএকটি প্রদান করে IO String, যা দুটি উপায়ে চিন্তা করা যায়: প্রথমত, একটি ক্রিয়া হিসাবে, যা যখন চালানো হয়, একটি স্ট্রিং উত্পাদন করে; দ্বিতীয়ত, স্ট্রিং হিসাবে এটি আইও দ্বারা "কলঙ্কিত" যেহেতু এটি অশুচিভাবে প্রাপ্ত হয়েছিল। প্রথমটি আরও সঠিক, তবে দ্বিতীয়টি আরও সহায়ক হতে পারে। <-লাগে Stringআউট IO Stringএবং এটি দোকানে str-কিন্তু যেহেতু আমরা একটি আই ক্রিয়াটি, আমরা এটা ব্যাক আপ মোড়ানো, তাই এটি "এস্কেপ" করতে পারেন না আছে। পরবর্তী লাইনটি একটি পূর্ণসংখ্যা পড়ার চেষ্টা করে ( reads) এবং প্রথম সফল ম্যাচটি ধরে ফেলে (fst . head); এটি সমস্ত খাঁটি (কোনও আইও নয়), তাই আমরা এটির সাথে একটি নাম দেব let no = ...। আমরা তখন উভয় ব্যবহার করতে পারেন noএবং str...। আমরা এইভাবে অপবিত্র ডেটা সংরক্ষণ করেছেন (থেকে getLineমধ্যে str) এবং বিশুদ্ধ তথ্য ( let no = ...)।

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

হাস্কেলের আইও ব্যবহার করার জন্য আপনার যা যা জানা দরকার তা হ'ল; যদি আপনি চান তবে আপনি এখানে থামতে পারেন। তবে এটি কেন কাজ করে তা যদি আপনি বুঝতে চান তবে পড়া চালিয়ে যান। (এবং দ্রষ্টব্য যে এই জিনিসটি হাস্কেলের সাথে নির্দিষ্ট হবে — অন্যান্য ভাষাগুলি আলাদা প্রয়োগ করতে পারে))

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

return :: a -> IO a
return a = \rw -> (a,rw)

(>>=) :: IO a -> (a -> IO b) -> IO b
ioa >>= fn = \rw -> let (a,rw') = ioa rw in fn a rw'

প্রথম এক আমাদের আই কর্ম যা কিছু করবেন না কথা বলার জন্য অনুমতি দেয়: return 3একটি আই কর্ম যা বাস্তব জগতে এবং মাত্র আয় অনুসন্ধান করে না 3>>=অপারেটর, উচ্চারিত "বেঁধে", আমাদের আই কর্ম চালানোর জন্য অনুমতি দেয়। এটি আইও অ্যাকশন থেকে মানটি বের করে, ফাংশনটির মাধ্যমে এটি এবং বাস্তব জগতকে পাস করে এবং ফলস্বরূপ আইও অ্যাকশনটি প্রদান করে। নোট করুন যে >>=আমাদের বিধি কার্যকর করে যে আইও ক্রিয়াকলাপগুলির ফলাফলকে কখনই এড়াতে দেওয়া হয় না।

এরপরে আমরা mainউপরেরটিকে ফাংশন অ্যাপ্লিকেশনগুলির নিম্নলিখিত সাধারণ সেটটিতে রূপান্তর করতে পারি :

main = getLine >>= \str -> let no = (fst . head $ reads str :: Integer) in ...

mainপ্রাথমিকের সাথে হাস্কেল রানটাইম জাম্প-শুরু হয় RealWorld, এবং আমরা প্রস্তুত হয়েছি! সবকিছু খাঁটি, এটিতে একটি অভিনব বাক্য গঠন রয়েছে।

[ সম্পাদনা: @ কনোনাল হিসাবে উল্লেখ করা হয়েছে , হাস্কেল আইও করার জন্য এটি ব্যবহার করে না। এই মডেলটি যদি আপনি একযোগে যুক্ত হন বা সত্যিই কোনও আইও অ্যাকশনের মাঝামাঝি বিশ্বের কোনও উপায় যুক্ত করেন তবে এই মডেলটি ভেঙে যায়, সুতরাং হাস্কেলের পক্ষে এই মডেলটি ব্যবহার করা অসম্ভব। এটি কেবলমাত্র অনুক্রমিক গণনার জন্য সঠিক। সুতরাং, এটি হতে পারে যে হাস্কেলের আইও কিছুটা ডজ; এটি না হলেও এটি অবশ্যই এই মার্জিত নয় leg কনল এর পর্যবেক্ষণ অনুসারে, অজওয়ার্ড স্কোয়াড [পিডিএফ] , ৩.১ বিভাগে সামলাতে সাইমন পাইটন-জোনস কী বলেছে তা দেখুন ; তিনি এই লাইনের পাশাপাশি কোনও বিকল্প মডেলের পরিমাণ কী হতে পারে তা উপস্থাপন করেন তবে তার জটিলতার জন্য এটিকে ফেলে দেন এবং আলাদা ট্যাক্স নেন]]

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

সুতরাং একটি শেষ জিনিস: এটি এই কাঠামোটি সক্রিয় করে - একটি প্যারাম্যাট্রিক টাইপ returnএবং >>=- খুব সাধারণ; এটি একটি একসংখ্যা বলা হয়, এবং doস্বরলিপি, returnএবং >>=তাদের সাথে হবে। আপনি যেমন এখানে দেখেছেন, মনদেহগুলি যাদু নয়; যাদুকর সব যে doব্লকগুলি ফাংশন কলগুলিতে পরিণত হয়। RealWorldটাইপ একমাত্র জায়গা আমরা কোনো জাদু দেখতে হয়। প্রকারের মতো [], তালিকার নির্মাণকারী, এছাড়াও মনড এবং তাদের অপরিষ্কার কোডের সাথে কোনও সম্পর্ক নেই।

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

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

(পিএস: দৈর্ঘ্যের জন্য দুঃখিত। আমি কিছুটা দূরে চলে এসেছি))


6
হাস্কেল সম্পর্কে যা সর্বদা আমাকে পায় (যা আমি তৈরি করেছি এবং শিখার জন্য বীরত্বপূর্ণ প্রচেষ্টা চালিয়ে যাচ্ছি) এটি সিনট্যাক্সের কদর্যতা। এগুলির মতো যে তারা প্রতিটি অন্যান্য ভাষার সবচেয়ে খারাপ বিট নিয়েছে, তাদের একটি বালতিতে ফেলে দিয়েছে এবং প্রচণ্ডভাবে আলোড়িত করেছে। এবং এই লোকেরা তখন সি ++ এর স্বীকৃতভাবে (জায়গাগুলিতে) অদ্ভুত বাক্য গঠন সম্পর্কে অভিযোগ করবে!

19
নীল: সত্যি? আমি আসলে হাস্কেলের সিনট্যাক্সটি খুব পরিষ্কার দেখতে পেয়েছি। আমি কৌতুহলী; বিশেষ করে আপনি কোনটি উল্লেখ করছেন? (এটির মূল্যের জন্য, > >টেমপ্লেটগুলি করার প্রয়োজন ব্যতীত সি ++ আমাকে সত্যিই বিরক্ত করে না ))
আন্টাল স্পেক্টর-জাবুসকি

6
আমার চোখে, যদিও হাস্কেলের সিনট্যাক্সটি পরিষ্কার হিসাবে বলুন না, স্কিম বলুন, এটি কোঁকড়ানো-ব্রেস ভাষাগুলির নিকৃষ্টতম সিনট্যাক্সের সাথে তুলনা করা শুরু করে না, যার মধ্যে সি ++ সবচেয়ে খারাপের মধ্যে রয়েছে । আমি মনে করি স্বাদের জন্য কোনও হিসাব নেই। আমি মনে করি না যে এমন একটি ভাষা রয়েছে যা প্রত্যেকে সিন্টেক্সিকভাবে আনন্দদায়ক মনে করে।
সিএ ম্যাকক্যান 21

8
@ নীলবাটারওয়ার্থ: আমি সন্দেহ করি যে আপনার সমস্যাটি ফাংশনের নামগুলির মতো সিনট্যাক্সের মতো নয়। মতো কাজগুলির যদি >>=বা $আরো যেখানে পরিবর্তে ডেকে bindএবং apply, Haskell কোড Perl মত অনেক কম দেখাবে। আমার অর্থ হ্যাসেল এবং স্কিম সিনট্যাক্সের মধ্যে প্রধান পার্থক্য হ্যাশকেলে ইনফিক্স অপারেটর এবং optionচ্ছিক প্যারেন্স রয়েছে। লোকেরা যদি ইনফিক্স অপারেটরদের অতিরিক্ত ব্যবহার থেকে বিরত থাকে, হ্যাশেল কম প্যারেন্স সহ অনেকটা স্কিমের মতো দেখায়।
sepp2k

4
@ ক্যামকান: আচ্ছা, পয়েন্ট, তবে আমি যা বোঝাতে চেয়েছি তা হ'ল: স্কিমের প্রাথমিক বাক্য গঠন (functionName arg1 arg2)। যদি আপনি প্যারেন্সগুলি সরিয়ে থাকেন তবে এটি functionName arg1 arg2হ্যাসেল সিনট্যাক্স। যদি আপনি ইনফিক্স অপারেটরগুলিকে নির্বিচারে ভয়ঙ্কর নাম দিয়ে থাকেন তবে তা পেয়ে arg1 §$%&/*°^? arg2যা হ্যাশেলের চেয়েও বেশি। (আমি কেবল বিটিডব্লিউ টিজ করছি, আমি আসলে হাস্কেল পছন্দ করি)।
sepp2k

23

এখানে প্রচুর ভাল উত্তর, তবে সেগুলি দীর্ঘ। আমি একটি সহায়ক সংক্ষিপ্ত উত্তর দেওয়ার চেষ্টা করতে যাচ্ছি:

  • কার্যকরী ভাষা সিগুলিতে একই স্থানে রাষ্ট্র রাখে: নামযুক্ত ভেরিয়েবলগুলিতে এবং গাদাতে বরাদ্দকৃত বস্তুগুলিতে। পার্থক্যগুলি হ'ল:

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

    • "রাষ্ট্রের পরিবর্তনগুলি" বিদ্যমান ভেরিয়েবল বা অবজেক্টগুলিকে রূপান্তরিত করে নয় নতুন ভেরিয়েবলকে আবদ্ধ করে বা নতুন অবজেক্ট বরাদ্দ করে পরিচালিত।

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

    • কোনও প্রোগ্রাম বিশ্বের অনুলিপি তৈরি করতে পারে না (আপনি এটি কোথায় রাখবেন?)

    • কোনও প্রোগ্রামই বিশ্বকে ফেলে দিতে পারে না

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

    এই কৌশলটি সুন্দরভাবে সাইমন পাইটন জোন্স এবং ফিল ওয়াডলার তাদের ল্যান্ডমার্ক পেপার "ইমপিটেটিভ ফাংশনাল প্রোগ্রামিং" তে ব্যাখ্যা করেছেন


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

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

4
আমি এটা বুঝতে হিসাবে, "বিশ্রী স্কোয়াড" কাগজ পরিত্যাগ সহজ denotational মডেল সাধারণীকরণ করা প্রয়াস IO, অর্থাৎ World -> (a,World)(জনপ্রিয় ও জেদি "শ্রুতি" আমি উল্লেখ করা হয়েছে) এবং পরিবর্তে একটি কর্মক্ষম ব্যাখ্যা দেয়। কিছু লোক অপারেশনাল শব্দার্থকগুলির মতো, তবে তারা আমাকে পুরোপুরি অসন্তুষ্ট রেখে দেয়। দয়া করে আমার উত্তরটি অন্য উত্তরে দেখুন।
কনল 17

+1 এটি আইও মনাদসকে প্রশ্নের উত্তর দেওয়ার পাশাপাশি আরও অনেক কিছু বুঝতে সহায়তা করেছে।
ক্যাপ্টেন কেসিতে

বেশিরভাগ হাস্কেল সংকলক আসলে IOহিসাবে এটি সংজ্ঞায়িত করে RealWorld -> (a,RealWorld)তবে প্রকৃত বিশ্বের প্রতিনিধিত্ব করার পরিবর্তে এটি কেবল একটি বিমূর্ত মান যা প্রায় পাস করতে হয় এবং সংকলকটির দ্বারা অপ্টিমাইজড হয়ে যায়।
জেরেমি তালিকা

19

আমি আরও একটি জায়গা দেওয়ার জন্য, একটি নতুন উত্তরের একটি মন্তব্যের জবাবটি ভেঙে দিচ্ছি:

আমি লিখেছিলাম:

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

নরম্যান লিখেছেন:

@ কনোনাল: আমি মনে করি আইও-র গল্পটি অদ্বিতীয়তত্ত্ব এবং আন্তঃলিখনকে খুব সুন্দর করে জেনারেল করেছে; যদি আমি ঠিক মনে করি তবে "অজওয়ার্ড স্কোয়াড" কাগজে বেশ ভাল ব্যাখ্যা আছে। তবে আমি এমন কোনও ভাল কাগজ সম্পর্কে জানিনা যা সত্য সমান্তরালতা পরিষ্কারভাবে ব্যাখ্যা করে।

@ নরম্যান: কোন অর্থে জেনারেলাইজড? আমি প্রস্তাব দিচ্ছি যে ডেনোটেশনাল মডেল / ব্যাখ্যা সাধারণত দেওয়া হয়, World -> (a,World)হাস্কেলের সাথে মেলে না IOকারণ এটি অদ্বিতীয়তাবাদ এবং একমত হওয়ার জন্য নয়। এমন আরও জটিল মডেল থাকতে পারে যা ফিট করে, যেমন World -> PowerSet [(a,World)], তবে আমি জানি না যে এই জাতীয় মডেলটি তৈরি হয়েছে এবং পর্যাপ্ত ও ধারাবাহিকভাবে প্রদর্শিত হয়েছে কিনা। আমি ব্যক্তিগতভাবে সন্দেহ করি যে IOহাজার হাজার এফএফআই-আমদানি করা অপরিহার্য এপিআই কল দ্বারা জনবসতিযুক্ত এমন একটি জন্তুটি পাওয়া যাবে । এবং যেমনটি IOএর উদ্দেশ্য পূরণ করছে:

ওপেন সমস্যা: IOমনাদ হ্যাস্কেলের পাপ-বিনে পরিণত হয়েছে। (যখনই আমরা কিছু বুঝতে পারি না, আমরা এটি আইও মোনাডে টস করি))

(সাইমন পিজে'র পিওপিএল টক থেকে চুলের শার্ট পরা চুলের শার্ট পরা: হাস্কেলের প্রতিচ্ছবি )

অ্যাওকওয়ার্ড স্কোয়াড মোকাবেলা করার ৩.১ অনুচ্ছেদে , সাইমন type IO a = World -> (a, World)" কীভাবে আমরা কাজ করি না সেদিকে দৃষ্টিভঙ্গি ভালভাবে মজায় না" সহ কী কাজ করে না তা উল্লেখ করে । তারপরে তিনি একটি সম্ভাব্য বিকল্পের মডেলটির পরামর্শ দেন এবং তারপরে ড্যানোটেশনাল ব্যাখ্যাগুলিতে এই প্রচেষ্টাটি ত্যাগ করেন

তবে আমরা পরিবর্তে প্রক্রিয়া কুলকুলির শব্দার্থবিজ্ঞানের মানক পদ্ধতির উপর ভিত্তি করে একটি অপারেশনাল শব্দার্থক গ্রহণ করব।

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


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

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

কেন আমি World -> (a, World)ভাঙা দেখছি কেন , কেন প্রতিস্থাপনের World -> PowerSet [(a,World)]সঠিকভাবে মডেলগুলি IOএকত্রিত করে তোলে ইত্যাদি সম্পর্কে আমি স্পষ্ট নই, আমার কাছে এটি বোঝা যাচ্ছে যে প্রোগ্রামগুলি তালিকা মোনাডের মতো চালানো উচিত, সেটের প্রতিটি আইটেমে নিজেকে প্রয়োগ করা উচিত applying IOকর্ম দ্বারা আমি কী মিস করছি?
আন্টাল স্পেক্টর-জাবুস্কি

4
@ অ্যাবস: প্রথমত, আমার প্রস্তাবিত মডেলটি World -> PowerSet [(a,World)]ঠিক নেই। World -> PowerSet ([World],a)পরিবর্তে চেষ্টা করা যাক । PowerSetসম্ভাব্য ফলাফলের সেট দেয় (অ-সংজ্ঞা)। [World]অন্তর্বর্তী রাষ্ট্রের ক্রম (তালিকা / ননডিটারিনিজম মোনাড নয়), ইন্টারলেভ করার অনুমতি দেয় (থ্রেড শিডিয়ুলিং)। এবং ([World],a)একেবারে ঠিক নয়, কারণ এটি aমধ্যবর্তী সমস্ত রাজ্যের মধ্য দিয়ে যাওয়ার আগে অ্যাক্সেসের অনুমতি দেয় । পরিবর্তে, World -> PowerSet (Computation a)যেখানে ব্যবহারের সংজ্ঞা দিনdata Computation a = Result a | Step World (Computation a)
কনল

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

17

কার্যকরী প্রোগ্রামিং ল্যাম্বডা ক্যালকুলাস থেকে প্রাপ্ত। আপনি যদি সত্যিকার অর্থে ফাংশনাল প্রোগ্রামিং বুঝতে চান তবে চেক আউট করুন

ল্যাম্বদা ক্যালকুলাস শিখতে এবং আপনাকে ফাংশনাল প্রোগ্রামিংয়ের আকর্ষণীয় বিশ্বে নিয়ে আসার এটি একটি "মজাদার" উপায়!

ল্যাম্বডা ক্যালকুলাসকে কীভাবে জানলে কার্যক্ষম প্রোগ্রামিংয়ে সহায়ক is

সুতরাং লাম্বডা ক্যালকুলাস হ'ল লিস্প, স্কিম, এমএল, হাস্কেল, .... এর মতো অনেক বাস্তব-বিশ্ব প্রোগ্রামিং ভাষার ভিত্তি is

মনে করুন আমরা কোনও ফাংশন বর্ণনা করতে চাই যা কোনও ইনপুটটিতে তিনটি যুক্ত করে তাই আমরা লিখব:

plus3 x = succ(succ(succ x)) 

পড়ুন "প্লাস 3 একটি ফাংশন যা কোনও সংখ্যার এক্সের সাথে প্রয়োগ করা হলে এক্স এর উত্তরসূরের উত্তরসূরির উত্তর দেয়"

মনে রাখবেন যে ফাংশনটি যে কোনও সংখ্যায় 3 যুক্ত করে নামকরণের প্রয়োজন হবে না 3; এই ফাংশনটির নামকরণের জন্য নাম "প্লাস 3" কেবল একটি সুবিধাজনক শর্টহ্যান্ড

(plus3 x) (succ 0) ≡ ((λ x. (succ (succ (succ x)))) (succ 0))

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

ল্যাম্বদা প্রতীকটি অলিগেটর (একটি ফাংশন) এবং x এর রঙ। আপনি এক্সকে আর্গুমেন্ট হিসাবেও ভাবতে পারেন (ল্যাম্বডা ক্যালকুলাস ফাংশনগুলি কেবলমাত্র একটি যুক্তি বলে মনে হয়) বাকী আপনি এটি ফাংশনটির প্রধান হিসাবে ভাবতে পারেন।

এখন বিমূর্ততা বিবেচনা করুন:

g ≡ λ f. (f (f (succ 0)))

আর্গুমেন্ট এফ একটি ফাংশন পজিশনে ব্যবহৃত হয় (একটি কলে)। আমরা গা কে হাই-অর্ডার ফাংশন বলি কারণ এটি একটি ইনপুট হিসাবে অন্য ফাংশন নেয়। আপনি অন্যান্য ক্রিয়াকলাপকে " ডিম " হিসাবে কল করতে পারেন । এখন দুটি ফাংশন বা " অলিগেটর " নিচ্ছেন আমরা তৈরি " আমরা এরকম কিছু করতে পারি:

(g plus3) = (λ f. (f (f (succ 0)))(λ x . (succ (succ (succ x)))) 
= ((λ x. (succ (succ (succ x)))((λ x. (succ (succ (succ x)))) (succ 0)))
 = ((λ x. (succ (succ (succ x)))) (succ (succ (succ (succ 0)))))
 = (succ (succ (succ (succ (succ (succ (succ 0)))))))

আপনি যদি খেয়াল করেন যে আমাদের All f এলিগেটর আমাদের λ x এলিগেটর এবং তারপরে λ x এলিগেটর খায় এবং মারা যায়। তারপরে আমাদের All x অলিগ্রেটার λ f এর এলিগেটর ডিমগুলিতে পুনরায় জন্মগ্রহণ করে। তারপরে প্রক্রিয়াটি পুনরাবৃত্তি করে এবং বামে λ x অ্যালিগিয়েটর এখন ডানদিকে অন্য λ ​​x অ্যালিগেটরটি খায়।

তারপরে আপনি " অ্যালিগেটর " খাওয়ার " নিয়মের এই সাধারণ সেটটি ব্যবহার করতে পারেন ব্যাকরণ ডিজাইনের অলিগেটর " এবং এভাবে কার্যকরী প্রোগ্রামিং ভাষার জন্ম হয়!

সুতরাং আপনি দেখতে পারেন যে আপনি ল্যাম্বদা ক্যালকুলাস জানেন কিনা তা আপনি বুঝতে পারবেন কীভাবে কার্যকরী ভাষাগুলি কাজ করে work


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

4
@eSKay: Haskell, হয় এটি আরো একটি স্বাভাবিক প্রোগ্রামিং ভাষা মত লাগে তা বানাতে, ল্যামডা ক্যালকুলাস অন্বিত চিনি একটি পাতলা স্তর সঙ্গে। লিস্প-পারিবারিক ভাষাগুলিও টাইপযুক্ত ল্যাম্বডা ক্যালকুলাসের সাথে খুব মিল, যা অলিগেটর ডিমগুলি প্রতিনিধিত্ব করে। লাম্বডা ক্যালকুলাস নিজেই মূলত একটি মিনিমালিস্ট প্রোগ্রামিং ভাষা, যেমন "ফাংশনাল প্রোগ্রামিং অ্যাসেম্বলি ল্যাঙ্গুয়েজ" এর মতো।
সিএ ম্যাকক্যান

@ এসকে: এটি কয়েকটি উদাহরণের সাথে কীভাবে সম্পর্কিত তার বিষয়ে আমি কিছুটা যুক্ত করেছি। আশা করি এটা কাজে লাগবে!
পিজেটি

আপনি যদি আমার উত্তরটি থেকে বিয়োগ করতে যাচ্ছেন তবে দয়া করে কেন আমি আমার উত্তরটি চেষ্টা করতে এবং উন্নত করতে পারি সে সম্পর্কে একটি মন্তব্য করতে পারেন। ধন্যবাদ.
পিজেটি

14

হাসকেলে রাজ্য পরিচালনা করার কৌশলটি খুব সোজা। এবং এটিতে একটি হ্যান্ডেল পাওয়ার জন্য আপনার মনাদগুলি বোঝার দরকার নেই।

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

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

এটিকে সংগঠিত করতে সাহায্য করার জন্য অনেকের মধ্যে মনডস একটি সরঞ্জাম। তবে মনাদস আসলে সমস্যার সমাধান নয়। সমাধানটি হ'ল রাষ্ট্রের পরিবর্তে রাষ্ট্রীয় রূপান্তর সম্পর্কে চিন্তা করা about

এটি I / O এর সাথেও কাজ করে। বাস্তবে যা ঘটে তা হ'ল ব্যবহারকারীর কাছ থেকে কিছুটা সরাসরি সমতুল্য ইনপুট পাওয়ার পরিবর্তে scanfএবং কোথাও এটি সংরক্ষণ করার পরিবর্তে আপনি একটি ফাংশন লিখুন scanfএটির ফলস্বরূপ আপনি কী করবেন তা বলার জন্য এবং তারপরে পাস করুন I / O API এ ফাংশন করুন। >>=আপনি যখন IOহাসকেলে মোনাড ব্যবহার করেন ঠিক এটিই হয় । সুতরাং আপনাকে কখনই কোনও আই / ও এর ফলাফল সংরক্ষণ করার দরকার নেই - আপনাকে কেবল এমন কোড লিখতে হবে যা আপনাকে কীভাবে রূপান্তর করতে চাইবে তা বলে।


8

(কিছু কার্যকরী ভাষা অপরিষ্কার ক্রিয়াকলাপের অনুমতি দেয়))

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

RealWorld pureScanf(RealWorld world, const char* format, ...);

প্রোগ্রামার থেকে দূরে বিশ্ব বিমূর্ত করার জন্য বিভিন্ন ভাষার বিভিন্ন কৌশল রয়েছে। উদাহরণস্বরূপ, হাস্কেল worldযুক্তিটি গোপন করার জন্য মনড ব্যবহার করে ।


তবে কার্যকরী ভাষার খাঁটি অংশটি ইতিমধ্যে টুরিং সম্পূর্ণ, যার অর্থ সিতে করণীয় যা কিছু হাস্কেলের মধ্যেও কার্যকর। অনিবার্য ভাষার মূল পার্থক্য হ'ল স্থানে থাকা রাজ্যগুলিকে পরিবর্তনের পরিবর্তে:

int compute_sum_of_squares (int min, int max) {
  int result = 0;
  for (int i = min; i < max; ++ i)
     result += i * i;  // modify "result" in place
  return result;
}

আপনি পরিবর্তনের অংশটি একটি ফাংশন কলে অন্তর্ভুক্ত করেন, সাধারণত লুপগুলি পুনরাবৃত্তিতে পরিণত করেন:

int compute_sum_of_squares (int min, int max) {
  if (min >= max)
    return 0;
  else
    return min * min + compute_sum_of_squares(min + 1, max);
}

অথবা কেবল computeSumOfSquares min max = sum [x*x | x <- [min..max]];-)
ফ্রেডওভারফ্লো

@ ফ্রেড: তালিকা অনুধাবন হ'ল একটি সিনট্যাকটিক চিনি (এবং তারপরে আপনাকে তালিকা মোনাডকে বিশদভাবে ব্যাখ্যা করতে হবে)। এবং আপনি কীভাবে বাস্তবায়ন করবেন sum? পুনরাবৃত্তি এখনও প্রয়োজন।
কেনেটিএম

3

কার্যকরী ভাষা পারে রাষ্ট্র সংরক্ষণ করুন! তারা সাধারণত হয় উত্সাহ দেয় বা এটি করার বিষয়ে আপনাকে সুস্পষ্ট হতে বাধ্য করে।

উদাহরণস্বরূপ, হাস্কেলের স্টেট মোনাড দেখুন


9
এবং মনে রাখবেন যে এগুলি রাষ্ট্রকে সক্ষম করে Stateবা এমন কিছুই করে না Monadযেহেতু এগুলি উভয়ই সাধারণ, সাধারণ, কার্যকরী সরঞ্জামগুলির ক্ষেত্রে সংজ্ঞায়িত করা হয়। তারা কেবল প্রাসঙ্গিক নিদর্শনগুলি ক্যাপচার করে, তাই আপনাকে চাকাটিকে এত বেশি পুনরায় উদ্বেগ করতে হবে না।
কনল


1

হাস্কেল:

main = do no <- readLn
          print (no + 1)

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


@ sepp2k: কেন, সেগুলি পরিবর্তন করতে কী ক্ষতি?
লেজার

@ ই এসকে আপনি যদি ভেরিয়েবলগুলি পরিবর্তন করতে না পারেন তবে আপনি জানেন যে সেগুলি সর্বদাই এক রকম। এটি ডিবাগ করা সহজ করে তোলে, আপনাকে সহজ কাজগুলি করতে বাধ্য করে যা কেবলমাত্র এবং খুব ভালভাবে একটি কাজ করে। সম্মতি সঙ্গে কাজ করার সময় এটি একটি দুর্দান্ত কাজকেও সহায়তা করে।
হেনরিক হানসেন

9
@ ই এসকে: কার্যকরী প্রোগ্রামাররা বিশ্বাস করেন যে পরিবর্তনীয় অবস্থা বাগের জন্য অনেক সম্ভাবনার পরিচয় দেয় এবং প্রোগ্রামগুলির আচরণ সম্পর্কে যুক্তিযুক্ত হতে আরও কঠিন করে তোলে। উদাহরণস্বরূপ, যদি আপনার একটি ফাংশন কল থাকে f(x)এবং আপনি x এর মান কী তা দেখতে চান, আপনাকে কেবল সেই জায়গায় যেতে হবে যেখানে এক্স সংজ্ঞায়িত হয়েছে। যদি x পরিবর্তনীয় হয় তবে আপনাকে এটিও বিবেচনা করতে হবে যে x এর সংজ্ঞা এবং এর ব্যবহারের মধ্যে x এর কোনও বিন্দু পরিবর্তিত হতে পারে কিনা (যা x স্থানীয় পরিবর্তনশীল না হলে অ-তুচ্ছ হয়)।
sepp2k

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

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