কার্যকরী ভাষায় গেটার্স এবং সেটটার্স


9

ফাংশনাল প্রোগ্রামিং এর অন্যতম ধারনা হ'ল খাঁটি ফাংশন ব্যবহার। একটি খাঁটি ফাংশনটি এমনটি যা পার্শ্ব-প্রতিক্রিয়া মুক্ত এবং স্বতঃস্ফূর্তভাবে স্বচ্ছ।

গেটারগুলি উল্লেখযোগ্যভাবে স্বচ্ছ হয় না - গেটারের কলগুলির মধ্যে যদি কোনও সেটারকে কল করা হয়, তবে গেটারের প্যারামিটারগুলি না থাকলেও গেটারের রিটার্নের মান পরিবর্তিত হয় (সাধারণত কোনও পরামিতি থাকে না)

সেটারগুলি পার্শ্ব-প্রতিক্রিয়া তৈরি করে - একটি সেটারকে কল করা সাধারণত এমন একটি মানকে ম্যানিপুলেট করে যা তার ফেরতের মান নয় (বাস্তবে, traditionতিহ্যগতভাবে কোনও সেটার কিছুই দেয় না)

আমি স্কেলায় জানি আমরা কেবল সত্যটি গ্রহণ করি যে আমরা দুটি দৃষ্টান্ত (কার্যকরী এবং বস্তু ভিত্তিক) একসাথে জাল করছি এবং জাটার মতো ভাষাতে যেমন গিটার / সেটার ব্যবহার করি।

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

সমাধানটি কি সেটারের ফেরতের মান হিসাবে সেটারটি যে বস্তুটির উপর নিযুক্ত হয়েছিল তার একটি অনুলিপি ফেরত পাঠানো হবে এবং এই অনুলিপিতে সম্পত্তি মানটির পরিবর্তন রয়েছে?


8
গেটার্স এবং সেটটারদের প্যারামিটার হিসাবে অবজেক্ট থাকে - যদিও এটি সাধারণত অন্তর্ভুক্ত থাকে - সুতরাং গেটাররা রেফারেনালিটি ট্রান্সফার হয়

@ ডেলানান, কেবলমাত্র যদি এটি পড়তে হয় এমন বৈশিষ্ট্যটি পরিবর্তনযোগ্য।
ড্যান_ওয়াটারওয়ার্থ

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

উত্তর:


7

যথাযথভাবে। কেস ক্লাস পদ্ধতি copy, বা লেন্সগুলির সাধারণ ধারণা দেখুন।

বিশেষত, যদি রাষ্ট্রের পরিবর্তনের প্রয়োজন হয় তবে আপনি একটি স্টেট মোনাড ব্যবহার করবেন। সেই রাজ্য মনাদে পরিবর্তন লেন্সগুলির মাধ্যমে করা যেতে পারে, যা "রাজ্য" থেকে তথ্য আহরণ এবং এটিকে সহজ করে তোলে।

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


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

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

11

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


1
"বস্তুগুলি (সাধারণত) অপরিবর্তনীয়" কখন হয় না?
সারা

-1

"গেটার্স এবং সেটটারদের প্যারামিটার হিসাবে অবজেক্ট থাকে - যদিও এটি সাধারণত অন্তর্নিহিত হয় - সুতরাং গেটাররা রেফারেন্সালি স্বচ্ছ হয় - ডেলানান"

উল্লেখযোগ্যভাবে স্বচ্ছ অর্থ হ'ল ফাংশন সর্বদা একই ইনপুটগুলির জন্য একই আউটপুট দেয়; সুতরাং যদি কোনও সেটার দ্বারা কোনও অবজেক্ট বৈশিষ্ট্য পরিবর্তন করা হয় তবে আপনি একই আউটপুটটি ফিরিয়ে দিচ্ছেন না। :)


তবে, যদি কোনও সেটারের দ্বারা বস্তুটি পরিবর্তন করা হয়, তবে গেটরটির ইনপুট (অর্থাত্ অন্তর্নিহিত স্ব-যুক্তি) পরিবর্তিত হয়েছে।
স্টিফেন সি স্টিল 21

1
বস্তুটির রেফারেন্স মান / পয়েন্টার পরিবর্তিত হয় না যতক্ষণ না অবজেক্টটি গাদাতে সরিয়ে নেওয়া হয়।
কেসি হাথর্ন

5
হ্যাঁ, তবে যৌক্তিকভাবে, অন্তর্নিহিত ইনপুটটি নিজেই অবজেক্ট, পয়েন্টারের মান নয়।
স্টিফেন সি স্টিল

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