একটি খাঁটি ফাংশনাল প্রোগ্রামিং ভাষা অ্যাসাইনমেন্টের বিবৃতি ছাড়াই পরিচালনা করবেন কীভাবে?


26

বিখ্যাত এসআইসিপি পড়ার সময়, আমি খুঁজে পেলাম যে লেখকরা অধ্যায় 3 এর স্কিমে অ্যাসাইনমেন্ট স্টেটমেন্টটি প্রবর্তন করতে অনিচ্ছুক বলে মনে হচ্ছে আমি পাঠ্য এবং তাদের ধরণটি বুঝতে পেরেছি কেন তারা এগুলি অনুভব করে।

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

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

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

উপরে বর্ণিত উদাহরণটি এখানে:

(define (make-withdraw balance)
    (lambda (amount)
        (if (>= balance amount)
            (begin (set! balance (- balance amount))
                balance)
            "Insufficient funds")))

এটি balanceদ্বারা পরিবর্তন করা হয়েছে set!। আমার কাছে এটি অনেকটা ক্লাস মেম্বার পরিবর্তন করার জন্য ক্লাস পদ্ধতির মতো দেখাচ্ছে balance

যেমনটি আমি বলেছি, আমি ক্রিয়ামূলক প্রোগ্রামিং ভাষার সাথে পরিচিত নই, তাই যদি আমি সেগুলি সম্পর্কে কিছু ভুল বলে থাকি তবে নির্দ্বিধায় বিন্দু মনে করি।


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

উত্তর:


21

যদি কোনও অ্যাসাইনমেন্ট স্টেটমেন্ট না থাকে তবে এটি কীভাবে করা যায়? কীভাবে ব্যালেন্স ভেরিয়েবল পরিবর্তন করবেন?

আপনি কোনও ধরণের অ্যাসাইনমেন্ট অপারেটর ছাড়া ভেরিয়েবল পরিবর্তন করতে পারবেন না।

আমি এটি জিজ্ঞাসা করছি কারণ আমি জানি যে এখানে কিছু তথাকথিত বিশুদ্ধ কার্যকরী ভাষা রয়েছে এবং ট্যুরিং সম্পূর্ণ তত্ত্ব অনুসারে এটিও করা যেতে পারে।

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

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

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


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

account = make-withdraw(0)
ask for input until the user enters "quit"
    if the user entered "withdraw $x"
        account(x)
    if the user entered "deposit $x"
        account(-x)
    if the user entered "query"
        print("The balance of the account is " + account(0))

পরিবর্তনীয়-ভেরিয়েবলগুলি ব্যবহার না করে একই প্রোগ্রামটি লেখার একটি উপায় এখানে (আমি উল্লেখযোগ্য স্বচ্ছ আইও নিয়ে বিরক্ত করব না কারণ প্রশ্নটি ছিল না):

function IO_loop(balance):
    ask for input
    if the user entered "withdraw $x"
        IO_loop(balance - x)
    if the user entered "deposit $x"
        IO_loop(balance + x)
    if the user entered "query"
        print("The balance of the account is " + balance)
        IO_loop(balance)
    if the user entered "quit"
        do nothing

 IO_loop(0)

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


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

@ গ্নিজুহজ সর্বদা নির্ভর করে আপনি কোন সমস্যার সমাধান করতে চাইছেন তার উপর। উদাহরণস্বরূপ, যদি আপনার শুরুর ব্যালেন্স থাকে এবং উত্তোলন এবং আমানতের একটি তালিকা থাকে এবং আপনি এই উত্তোলন এবং আমানতের পরে ভারসাম্যটি জানতে চান, আপনি কেবলমাত্র আমানতের যোগফলের যোগফলের যোগফলের যোগফলের পরিমাণ গণনা করতে পারেন এবং এটিকে প্রারম্ভিক ব্যালেন্সে যুক্ত করতে পারেন । সুতরাং কোড যে হবে newBalance = startingBalance + sum(deposits) - sum(withdrawals)
sepp2k

1
@ জ্নিজুহজ আমি আমার উত্তরে একটি উদাহরণ প্রোগ্রাম যুক্ত করেছি।
sepp2k

আপনি উত্তরটি লিখিত এবং পুনরায় লেখার সময় এবং প্রচেষ্টার জন্য ধন্যবাদ! :)
গিঞ্জুহুজ

আমি যুক্ত করব যে ধারাবাহিকতা ব্যবহার করাও
এটির

11

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

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

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


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

3
@ গ্নিজুহজ সর্বশেষ অনুচ্ছেদটি বলছে যে আপনি পরিবর্তে কেবল যেখানে b = makeWithdraw(42); b(1); b(2); b(3); print(b(4))করতে পারেন ঠিক তেমন সংজ্ঞা দেওয়া হয়েছে । b = 42; b1 = withdraw(b1, 1); b2 = withdraw(b1, 2); b3 = withdraw(b2, 3); print(withdraw(b3, 4));withdrawwithdraw(balance, amount) = balance - amount
sepp2k

3

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

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

আপনার নির্দিষ্ট উদাহরণে, আপনি ঠিক - সেট! অপারেটর হয় একটি কাজ। এটা না একটি পার্শ্ব প্রতিক্রিয়া মুক্ত অপারেটর, এবং এটি একটি জায়গা যেখানে প্রোগ্রামিং একটি বিশুদ্ধরূপে কার্মিক পদ্ধতির স্কিম বিরতি।

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


"শেষ পর্যন্ত, যে কোনও নিখুঁত কার্যকরী ভাষাটি খাঁটি কার্যকরী পদ্ধতির সাথে কিছু সময় ভেঙে যেতে পারে - বেশিরভাগ দরকারী প্রোগ্রামেরই এর পার্শ্ব প্রতিক্রিয়া রয়েছে" সত্য, তবে আপনি আইও এবং এরকম করার বিষয়ে কথা বলছেন। পরিবর্তনশীল ভেরিয়েবল ব্যতীত প্রচুর দরকারী প্রোগ্রাম লেখা যায়।
sepp2k

1
... এবং দরকারী প্রোগ্রামগুলির "বিশাল সংখ্যাগরিষ্ঠ" দ্বারা, আপনার অর্থ "সমস্ত", তাই না? এমনকি আমি এমন কোনও প্রোগ্রামের অস্তিত্বের সম্ভাবনা কল্পনা করতেও অসুবিধা বোধ করছি যা I / O সম্পাদন করে না এমন যুক্তিযুক্তভাবে "দরকারী" বলা যেতে পারে, এমন একটি কাজ যা উভয় দিকেই পার্শ্ব প্রতিক্রিয়া প্রয়োজন।
ম্যাসন হুইলারের

@ ম্যাসনওহিলার এসকিউএল প্রোগ্রামগুলি আইও করে না। এমন একটি ফাংশন লিখতে অস্বাভাবিক কিছু নয় যা একটি ভাষায় IO না করে যার একটি REPL থাকে এবং তারপরে কেবল একটি REPL থেকে ফোন করে। আপনার টার্গেট শ্রোতারা আরপিএল ব্যবহার করতে সক্ষম হলে এটি পুরোপুরি কার্যকর হতে পারে (বিশেষত যদি আপনার টার্গেট শ্রোতারা আপনি হন)।
sepp2k

1
@ ম্যাসনভিয়েল: কেবলমাত্র একটি একক, সহজ পাল্টা উদাহরণ: ধারণাগতভাবে পাই এর n অঙ্কগুলি গণনা করার জন্য কোনও আই / ও দরকার হয় না। এটি "কেবল" গণিত এবং ভেরিয়েবল। কেবলমাত্র প্রয়োজনীয় ইনপুটটি হল এন এবং ফেরতের মান পাই (টু এন অঙ্ক)।
জোচিম সৌর

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

3

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

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

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

দাবি অস্বীকার : আমি খাঁটি ফাংশনাল প্রোগ্রামিংয়ের গির্জার অন্তর্ভুক্ত নই। আসলে, আমি কোনও গির্জার অন্তর্ভুক্ত নই :-)


আমার ধারণা আপনি কোনও মন্দিরের? :
পি

1
মুক্তচিন্তার মন্দির। সেখানে কোন প্রচারক নেই।
উদয় রেড্ডি

2

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

(define +no-founds+ "Insufficient funds")

;; functional withdraw
(define (make-withdraw balance amount)
    (if (>= balance amount)
        (- balance amount)
        +no-founds+))

;; functional atm loop
(define (atm balance thunk)
  (let* ((amount (thunk balance)) 
         (new-balance (make-withdraw balance amount)))
    (if (eqv? new-balance +no-founds+)
        (cons +no-founds+ '())
        (cons (list 'withdraw amount 'balance new-balance) (atm new-balance thunk)))))

;; functional balance-line -> string 
(define (balance->string x)
  (if (eqv? x +no-founds+)
      (string-append +no-founds+ "\n")
      (if (null? x)
          "\n"
          (let ((first-token (car x)))
            (string-append
             (cond ((symbol? first-token) (symbol->string first-token))
                   (else (number->string first-token)))
             " "
             (balance->string (cdr x)))))))

;; functional thunk to test  
(define (input-10 x) 10) ;; define a purly functional input-method

;; since all procedures involved are functional 
;; we expect the same result every time.
;; we use this to test atm and make-withdraw
(apply string-append (map balance->string (atm 100 input-10)))

;; no program can be purly functional in any language.
;; From here on there are imperative dirty procedures!

;; A procedure to get input from user is needed. 
;; Side effects makes it imperative
(define (user-input balance)
  (display "You have $")
  (display balance)
  (display " founds. How much to withdraw? ")
  (read))

;; We need a procedure to print stuff to the console 
;; as well. Side effects makes it imperative
(define (pretty-print-result x)
  (for-each (lambda (x) (display (balance->string x))) x))

;; use imperative procedure with atm.
(pretty-print-result (atm 100 user-input))

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


প্রোগ্রামের কার্যকরী অংশ এবং খাঁটি কার্যকরী অংশগুলি সম্পর্কে বিস্তৃত উদাহরণ এবং বাস্তব ব্যাখ্যাগুলির জন্য +1 এবং তবুও কেন এফপি গুরুত্বপূর্ণ তা উল্লেখ করে।
জেলফির কালটসটহল

1

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

  1. ফাংশন প্যারামিটারগুলি মানগুলি ফেরত দেওয়ার জন্য সরাসরি লিঙ্কযুক্ত
  2. বিদ্যমান অবজেক্টগুলিকে সংশোধন না করে প্রত্যাবর্তনের জন্য বিভিন্ন বস্তু নির্বাচন করা।
  3. নতুন অলস-মূল্যায়িত মান তৈরি করা
  4. সমস্ত সম্ভাব্য অবজেক্টের তালিকাভুক্ত করা হচ্ছে , কেবল স্মৃতিতে থাকা দরকার না
  5. কোন পার্শ্ব প্রতিক্রিয়া

এটি মনে করা প্রশ্নটির সমাধান বলে মনে হচ্ছে না। খাঁটি কার্যকরী ভাষায় আপনি কীভাবে কোনও ব্যাংক অ্যাকাউন্ট অবজেক্টটিকে প্রোগ্রাম করবেন?
উদয় রেড্ডি

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

আপনি যখন একটি ব্যাঙ্ক অ্যাকাউন্টের রেকর্ডকে অন্যটিতে রূপান্তরিত করেন, আপনি গ্রাহকটি নতুন রেকর্ডে পরবর্তী লেনদেনটি করতে চান, পুরানোটি নয়। গ্রাহকের জন্য "যোগাযোগ পয়েন্ট" অব্যাহতভাবে বর্তমান রেকর্ডে নির্দেশ করতে আপডেট করা উচিত। এটি "সংশোধন" এর একটি মৌলিক ধারণা। ব্যাংক অ্যাকাউন্ট "অবজেক্টস" ব্যাংক অ্যাকাউন্ট রেকর্ড নয়।
উদয় রেড্ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.