বীজগণিত তথ্য প্রকারের ব্যবহার কি?


16

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


সম্পাদনা: আমি জিজ্ঞাসা করছি না যে বিকাশকারীরা ADT এর সাথে কী করতে পারে যা বস্তুগুলি দিয়ে করা যায় না। আমি জিজ্ঞাসা করছি যে অন্য কোনও অপারেশন রয়েছে যা এডিটির অনুমতি দেয়; উদাহরণস্বরূপ, কেউ এডিটি নিয়োগপ্রাপ্ত হলে জড়িত প্রকারগুলি সম্পর্কে অতিরিক্ত যুক্তি করতে পারে? এডিটি কি এমন এক ধরণের বিশ্লেষণের সুবিধা দেয় যা এগুলি ছাড়া সম্ভব না?


2
কল করার পদ্ধতি বাদ দিয়ে আপনি অবজেক্টগুলির সাথে কী করতে পারেন?

1
এডিটি আসলে "বিমূর্ত ডাটা টাইপ" বোঝায়, বীজগণিত ডেটা ধরণের নয়।
রেন হেনরিচস

4
@ রিন: এটি প্রসঙ্গের উপর নির্ভর করে উল্লেখ করতে পারে।
sepp2k

4
@ রেইন: এটি সত্যিই রয়েছে (যা আমি সত্য বলতে বেশ অবাক করে দিয়েছি): তবে এডিটি-র উইকিপিডিয়া নিবন্ধে সম্ভাব্য অর্থ হিসাবে অ্যাবস্ট্রাক্ট ডেটা টাইপ এবং বীজগণিত ডেটা টাইপ উভয়কেই তালিকাভুক্ত করা হয়েছে। এবং ADT খুব সাধারণত বীজগণিত ডেটা টাইপের সংক্ষেপণ হিসাবে ব্যবহৃত হয় যেমন হাস্কেল মেলিং তালিকা এবং আইআরসি চ্যানেল।
sepp2k

1
@ রেইন, আমি জানি - কেবলমাত্র "বীজগণিত ডেটা টাইপ" টাইপ করে বারবার ক্লান্ত হয়ে পড়েছি এবং আমি বুঝতে পেরেছি যে প্রসঙ্গে আমি কী উল্লেখ করছি তা লোকেরা বুঝতে সক্ষম হবে।
ওনোরিও ক্যাটেনাচি

উত্তর:


10

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

data Tree = Empty
          | Leaf Int
          | Node Tree Tree

যেহেতু একটি নোড দুটি গাছের সমন্বয়ে গঠিত, তাই বীজগণিতের ডেটা ধরণের পুনরাবৃত্তি হতে পারে।

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

depth :: Tree -> Int
depth Empty = 0
depth (Leaf n) = 1
depth (Node l r) = 1 + max (depth l) (depth r)

তুলনা করা:

switch on (data.constructor)
  case Empty:
    return 0
  case Leaf:
    return 1
  case Node:
    let l = data.field1
    let r = data.field2
    return 1 + max (depth l) (depth r)

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

অবশ্যই, হাঁসের-টাইপিং ল্যাঙ্গেজ এরকম কিছু করতে পারে:

class Empty
  def depth
    0
  end
end

class Leaf
  def depth
    1
  end
end

class Node
  attr_accessor :field1, :field2

  def depth
    1 + [field1.depth, field2.depth].max
  end
end

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


9

আমি এতটা নিশ্চিত নই যে ব্যাখ্যাটি সমস্ত দুর্দান্ত।

বীজগণিত ডেটা টাইপগুলি তালিকা এবং গাছের মতো ডেটা স্ট্রাকচার তৈরি করতে ব্যবহৃত হয়।

উদাহরণস্বরূপ পার্স গাছগুলি সহজেই বীজগণিত ডেটা স্ট্রাকচারের সাথে প্রতিনিধিত্ব করা হয়।

data BinOperator = Add
                 | Subtr
                 | Div
                 | Mult
                 | Mod
                 | Eq
                 | NotEq
                 | GreaterThan
                 | LogicAnd
                 | LogicOr
                 | BitAnd
                 | BitOr
                 | ...

data UnOperator = Negate
                | Not
                | Increment
                | Decrement
                | Complement
                | Ref
                | DeRef


data Expression = Empty
                | IntConst Int
                | FloatConst Float
                | StringConst String
                | Ident String
                | BinOp BinOperator Expression Expression
                | UnOp UnOperator Expression Bool //prefix or not
                | If Expression Expression Expression
                | While Expression Expression Bool //while vs. do while
                | Block List<Expression>
                | Call Expression List<Expression>
                | ...

এটি সি ভাষার প্রতিনিধিত্ব করতে আসলে আরও বেশি কিছু নেবে না।

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

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

If(Call(Ident('likes_ADTs'),[Ident('you')]),
   Call(Ident('use_ADTs'),[Ident('you')]),
   Call(Ident('use_no_ADTs'),[Ident('you')]))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.