বীজগণিত সংক্রান্ত ডেটা ধরণের সমস্যাটি কী সমাধান করে?


18

যথাযথ সতর্কতা, আমি কার্যকরী প্রোগ্রামিংয়ে নতুন তাই আমি অনেক খারাপ ধারণা ধরে রাখতে পারি।

আমি বীজগণিতের ধরণগুলি সম্পর্কে শিখছি। অনেকগুলি কার্যকরী ভাষা তাদের কাছে রয়েছে বলে মনে হয় এবং এগুলি প্যাটার্ন মেলানোর সাথে মিলিয়ে মোটামুটি কার্যকর useful যাইহোক, তারা আসলে কোন সমস্যাটি সমাধান করে? আমি সি # এর মতো একটি আপাতদৃষ্টিতে (সাজ্টের) বীজগণিত টাইপ প্রয়োগ করতে পারি:

public abstract class Option { }
public class None : Option { }
public class Some<T> : Option
{
    public T Value { get; set; }
}

var result = GetSomeValue();
if(result is None)
{
}
else
{
}

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


6
ফাংশনাল প্রোগ্রামিং হ'ল অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের চেয়ে আলাদা দৃষ্টান্ত।
বেসাইল স্টারিনকিভিচ

@ বাসাইলস্টারিঙ্কেভিচ আমি বুঝতে পেরেছি, তবে এফ # এর মতো ভাষা রয়েছে যা উভয়েরই সামান্য। কার্যকরী ভাষা সম্পর্কে প্রশ্ন এতটা নয়, তবে বীজগণিতের ডেটা ধরণের সমস্যাগুলি কী সমাধান করে তা সম্পর্কে আরও।
কন্ডিশন

7
আমি যখন সংজ্ঞা দিয়েছি class ThirdOption : Option{}এবং আপনি new ThirdOption()যেখানে প্রত্যাশা করেছিলেন Someবা এটি দিয়েছিলাম তখন কী হবে None?
আমন

1
@amon ভাষাগুলির সমষ্টি প্রকারেরগুলিতে সাধারণত তা অস্বীকার করার উপায় রয়েছে। উদাহরণস্বরূপ, হাস্কেল সংজ্ঞা দেয় data Maybe a = Just a | Nothing( data Option a = Some a | Noneআপনার উদাহরণের সমান ): আপনি কোনও তৃতীয় কেস পোস্ট-হক যুক্ত করতে পারবেন না। আপনি যেভাবে দেখিয়েছেন সেভাবে আপনি সি # তে যোগফলের ধরণের প্রকারের সাজিয়ে তোলা করতে পারেন, এটি সবচেয়ে সুন্দর নয়।
মার্টিজন

1
আমি মনে করি এটি "ADT গুলি কী সমস্যা সমাধান করে" এর চেয়ে কম এবং "ADTs জিনিসগুলির কাছে আসার একটি আলাদা উপায়" like
গাণিতিক

উত্তর:


44

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

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

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


আপনি কোনও ম্যাচ আপডেট করতে ব্যর্থ হলে আপনি কি একটি সংকলক ত্রুটি পেয়েছেন, বা এটি কেবল রান টাইমে আপনি খুঁজে পেয়েছেন?
ইয়ান

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

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

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

কল্পনা করুন যে আপনি এন বুলিয়ানসের সাথে মিলছেন। তারপরে আপনি ম্যাচের ধারাগুলি যুক্ত করুন (ক, খ, _, ডি, ...)। ক্যাচ-অল কেসটি তখন! ক্লজ 1 &&! ক্লজ 2 && .... এটাই আমার কাছে স্যাট লাগছে।
usr

12

তাহলে কার্যক্ষম প্রোগ্রামিং কি কেবল এমন একটি ক্লিনার সিনট্যাক্স যুক্ত করে যা এই স্টাইলের প্রোগ্রামিংকে কম গুরুতর বলে মনে করে?

এটি সম্ভবত একটি সরলীকরণ, তবে হ্যাঁ।

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

আসুন বীজগণিত সংক্রান্ত ডেটা কী কী তা সম্পর্কে স্পষ্ট হয়ে উঠুন (শেখুন আপনাকে হাস্কেল হিসাবে এই সূক্ষ্ম লিঙ্কটির সংক্ষিপ্তসার ):

  • একটি যোগফলের ধরণ যা বলে যে "এই মানটি একটি বা একটি বি হতে পারে "।
  • একটি পণ্যের ধরণ যা বলে যে "এই মানটি একটি এ এবং বি উভয় "।

আপনার উদাহরণটি কেবল প্রথমটির সাথেই কাজ করে।

আপনি যা হারিয়ে যাচ্ছেন তা হ'ল এই দুটি বুনিয়াদি ক্রিয়াকলাপ সরবরাহ করে, কার্যকরী ভাষা আপনাকে অন্য কিছু তৈরি করতে দেয়। এই # টি কী আচরণ করে তা পরিচালনা করার জন্য সি # এর স্ট্রাক্ট, ক্লাস, এনাম, জেনারিকস এবং নিয়মের পাইল রয়েছে।

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

বীজগণিত সংক্রান্ত ডেটা ধরণের সমস্যাটি কী সমাধান করে?

তারা অন্য যে কোনও প্রকারের ব্যবস্থার মতোই সমস্যাটি সমাধান করে: "এখানে কী মানগুলি ব্যবহার করা বৈধ?" - তারা কেবল এটির জন্য একটি ভিন্ন পদ্ধতির গ্রহণ করে।


4
আপনার শেষ বাক্যটি এমন কাউকে বলার মতো যা "জাহাজগুলি বিমানের মতো একই সমস্যার সমাধান করে: পরিবহন - তারা কেবল এটির জন্য একটি ভিন্ন পদ্ধতির গ্রহণ করে"। এটি সম্পূর্ণরূপে সঠিক বিবৃতি এবং একটি দুর্দান্ত বেহুদা।
মেহরদাদ

@ মেহরদাদ - আমি মনে করি এটি কিছুটা বাড়িয়ে দিচ্ছে।
টেলাস্টিন

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

6

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

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

val name: Option[String] = request getParameter "name"
val upper = name map { _.trim } filter { _.length != 0 } map { _.toUpperCase }
println(upper getOrElse "")

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

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

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