প্রোগ্রামিংয়ের প্রসঙ্গে "কয়লাজেব্রা" অর্থ কী?


339

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


21
: আমি FP মধ্যে জেরেমি গিবনস 'চমৎকার বই প্যাটার্নস সুপারিশ পারে patternsinfp.wordpress.com এবং তার বেশ বোধগম্য কাগজ "প্রায়োগিক প্রোগ্রাম গণনা করা হচ্ছে"? তারা উভয়ই বেশ কড়া ফ্যাশনে কয়লাজেব্রাকে coverেকে রাখে (তুলনায়, উদাহরণস্বরূপ, একটি ব্লগ পোস্ট), তবে তারা হাস্কেলের কিছুটা জানেন এমন ব্যক্তির পক্ষে মোটামুটি স্বও রয়েছে।
ক্রিস্টোফার মিকিনস্কি

2
@ ক্রিস্টোফারমিসিনস্কি, খুব আকর্ষণীয়। ধন্যবাদ!
অনুপস্থিতি

উত্তর:


474

algebras

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

একটি বীজগণিত, তখন কেবল τকিছু ফাংশন এবং পরিচয় সহ একটি প্রকার । এই ফাংশনগুলি বিভিন্ন ধরণের আর্গুমেন্ট গ্রহণ করে τএবং একটি উত্পাদন করে τ: অনাকাঙ্ক্ষিত, তারা সমস্ত দেখতে দেখতে (τ, τ,…, τ) → τ। তাদের "পরিচয়" থাকতে পারে - উপাদানগুলির τকিছু ক্রিয়াকলাপের সাথে বিশেষ আচরণ করা হয়।

এর সহজ উদাহরণ হ'ল মনোয়েড। একটি মনোড হ'ল τফাংশন mappend ∷ (τ, τ) → τএবং একটি পরিচয় সহ যে কোনও ধরণের mzero ∷ τ। অন্যান্য উদাহরণগুলিতে গোষ্ঠীগুলির মতো জিনিস (যা অতিরিক্ত invert ∷ τ → τফাংশন ব্যতীত মনোয়েডের মতো ), রিং, ল্যাটিসেস ইত্যাদি অন্তর্ভুক্ত।

সমস্ত ফাংশন কাজ করে τতবে বিভিন্ন বৈশিষ্ট্য থাকতে পারে। আমরা এগুলি এখানে লিখতে পারি τⁿ → τ, যেখানে τⁿমানচিত্রগুলি একটি গোছানো হয় n τ। এইভাবে, এটি খালি টিপলটি τ⁰ → τকোথায় আছে τ⁰তা পরিচয়গুলি ভাবতে অনুধাবন করে ()। সুতরাং আমরা এখন বীজগণিতের ধারণাটি এখন সহজতর করতে পারি: এটিতে কিছু সংখ্যক ফাংশন রয়েছে।

বীজগণিত হ'ল গণিতে কেবল একটি সাধারণ প্যাটার্ন যা "কোডড আউট" হয়েছে, ঠিক যেমন আমরা কোড দিয়ে করি। লোকেরা লক্ষ্য করেছে যে পুরো গুচ্ছ আকর্ষণীয় জিনিসগুলি — উপরোক্ত মনোয়েডস, দলগুলি, জালগুলি এবং আরও on সমস্ত একই ধরণের অনুসরণ করে, তাই তারা এটিকে বিমূর্ত করে তুলেছিল। এটি করার সুবিধা প্রোগ্রামিংয়ের মতোই: এটি পুনরায় ব্যবহারযোগ্য প্রমাণ তৈরি করে এবং নির্দিষ্ট ধরণের যুক্তি আরও সহজ করে তোলে।

এফ algebras

তবে, আমরা ফ্যাক্টরিংয়ের কাজটি পুরোপুরি সম্পন্ন করি না। এখনও অবধি, আমাদের বেশ কয়েকটি ফাংশন রয়েছে τⁿ → τ। সেগুলিকে একটি ফাংশনে একত্রিত করার জন্য আমরা আসলে একটি ঝরঝরে কৌশল করতে পারি। বিশেষত, আসুন মনোয়েডগুলি দেখুন: আমাদের আছে mappend ∷ (τ, τ) → τএবং mempty ∷ () → τ। আমরা একটি একক কার্যকারিতা একটি সমষ্টি type- ব্যবহার মধ্যে এই চালু করতে পারেন Either। এটি দেখতে এটি দেখতে হবে:

op  Monoid τ  Either (τ, τ) ()  τ
op (Left (a, b)) = mappend (a, b)
op (Right ())    = mempty

আমরা আসলে একত্রিত করতে বারবার এই রূপান্তর ব্যবহার করতে পারেন সবτⁿ → τ জন্য, একটি একক এক ফাংশন কোনো বীজগণিত। (আসলে, আমরা ফাংশন যে কোন সংখ্যার জন্য এটা করতে পারেন a → τ, b → τএবং তাই জন্য কোন a, b,… ।)

এটি আমাদের একটি ধরন হিসাবে algebras সম্পর্কে কথা বলতে দেয় τএকটি সঙ্গে একক ফাংশন কিছু জগাখিচুড়ি থেকে Eitherগুলি একটি একক থেকে τ। Monoids জন্য, এই জগাখিচুড়ি: Either (τ, τ) (); গ্রুপ (যা একটি অতিরিক্ত আছে তাদের জন্য τ → τঅপারেশন), এটা আছে: Either (Either (τ, τ) τ) ()। এটি প্রতিটি ভিন্ন কাঠামোর জন্য একটি আলাদা ধরণের। তাহলে এই সমস্ত ধরণের কী মিল রয়েছে? সর্বাধিক সুস্পষ্ট বিষয় হ'ল এগুলি সমস্ত পণ্যগুলির বীজের পরিমাণ — বীজগণিতের ডেটা ধরণের। উদাহরণস্বরূপ, মনোয়েডগুলির জন্য, আমরা কোনও মনোয়েড আর্গুমেন্ট টাইপ তৈরি করতে পারি যা কোনও মনোয়েডের জন্য কাজ করে τ:

data MonoidArgument τ = Mappend τ τ -- here τ τ is the same as (τ, τ)
                      | Mempty      -- here we can just leave the () out

আমরা গ্রুপ এবং রিং এবং জাল এবং অন্যান্য সমস্ত সম্ভাব্য কাঠামোর জন্য একই জিনিস করতে পারি can

এই সব ধরণের সম্পর্কে আর কী বিশেষ? ঠিক আছে, তারা সবাই Functors! উদাহরণ:

instance Functor MonoidArgument where
  fmap f (Mappend τ τ) = Mappend (f τ) (f τ)
  fmap f Mempty        = Mempty

সুতরাং আমরা বীজগণিত সম্পর্কে আমাদের ধারণাটিকে আরও সাধারণ করতে পারি। এটি কিছু ফান্টারের জন্য τএকটি ফাংশন সহ কেবল কিছু টাইপ । আসলে, আমরা এটি টাইপক্লাস হিসাবে লিখতে পারি:f τ → τf

class Functor f  Algebra f τ where
  op  f τ  τ

এটিকে প্রায়শই "এফ-বীজগণিত" বলা হয় কারণ এটি ফ্যাঙ্ক্টর দ্বারা নির্ধারিত হয় F। আমরা যদি আংশিকভাবে টাইপক্লাস প্রয়োগ করতে পারি, আমরা এর মতো কিছু সংজ্ঞায়িত করতে পারি class Monoid = Algebra MonoidArgument

Coalgebras

এখন, আশা করি বীজগণিত কী এবং আপনার কীভাবে এটি সাধারণ বীজগণিত কাঠামোর সাধারণীকরণ রয়েছে সে সম্পর্কে আপনার ভাল ধারণা রয়েছে। তাহলে এফ-কয়লাজেব্রা কী? ঠিক আছে, কোটি বোঝায় যে এটি একটি বীজগণিতের "দ্বৈত", অর্থাৎ, আমরা একটি বীজগণিত গ্রহণ করি এবং কিছু তীর ফ্লিপ করি। আমি উপরের সংজ্ঞায় কেবল একটি তীর দেখতে পাচ্ছি, তাই আমি এটি সরিয়ে ফেলব:

class Functor f  CoAlgebra f τ where
  coop  τ  f τ

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

ক্লাস এবং অবজেক্টস

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

হিসাবে বীজগণিত উদাহরণে দেখানো, যদি আমরা মতো কাজগুলির একটি গুচ্ছ আছে a → τএবং b → τকোন a, b,…, আমরা তাদের সমস্ত একটি একক ফাংশন ব্যবহার করে একত্রিত করতে Either, একটি সমষ্টি প্রকার। দ্বৈত "ধারণা" টাইপ কার্যাবলী একটি গুচ্ছ মিশ্রন হবে τ → a, τ → bইত্যাদি। আমরা যোগফলের ধরণ - একটি পণ্যের ধরণের দ্বৈত ব্যবহার করে এটি করতে পারি। সুতরাং উপরের দুটি ক্রিয়াকলাপ দেওয়া (বলা fএবং g), আমরা এর মতো একটি একক তৈরি করতে পারি:

both  τ  (a, b)
both x = (f x, g x)

প্রকারটি (a, a)সোজা উপায়ে ফান্টেক্টর, সুতরাং এটি অবশ্যই আমাদের একটি এফ-কয়লাজেব্রা ধারণার সাথে খাপ খায়। এই নির্দিষ্ট কৌশলটি আমাদের বিভিন্ন ফাংশন O বা, ওওপি জন্য, পদ্ধতিগুলিকে এক ধরণের একক ফাংশনে প্যাকেজ করতে দেয় τ → f τ

আমাদের ধরণের উপাদানগুলি বস্তুর অভ্যন্তরীণ অবস্থা Cউপস্থাপন করে । যদি অবজেক্টটির কিছু পাঠযোগ্য বৈশিষ্ট্য থাকে তবে তাদের রাষ্ট্রের উপর নির্ভর করতে সক্ষম হতে হবে। এটি করার সর্বাধিক সুস্পষ্ট উপায় হ'ল তাদের একটি ফাংশন তৈরি করা । সুতরাং আমরা একটি দৈর্ঘ্য সম্পত্তি (যেমন চান ), আমরা একটি ফাংশন হবে ।Cobject.lengthC → Int

আমরা এমন পদ্ধতি চাই যা একটি যুক্তি নিয়ে এবং রাষ্ট্রের পরিবর্তন করতে পারে। এটি করার জন্য, আমাদের সমস্ত আর্গুমেন্ট নেওয়া এবং একটি নতুন উত্পাদন করা দরকার C। এর একটি কল্পনা করা যাক setPositionপদ্ধতি যা একটি লাগে xএবং একটি yতুল্য: object.setPosition(1, 2)। এটি দেখতে এমন হবে: C → ((Int, Int) → C)

এখানে গুরুত্বপূর্ণ প্যাটার্নটি হ'ল বস্তুর "পদ্ধতি" এবং "বৈশিষ্ট্য" বস্তুটিকে তাদের প্রথম যুক্তি হিসাবে গ্রহণ করে take এটি ঠিক selfপাইথনের প্যারামিটারের মতো এবং thisঅন্যান্য অনেকগুলি ভাষার অন্তর্ভুক্ত like একজন coalgebra মূলত শুধু একটি গ্রহণের আচরণ encapsulates selfপরামিতি: যে প্রথম কি Cমধ্যে C → F Cহয়।

সুতরাং আসুন এটি একসাথে করা যাক। আসুন একটি positionসম্পত্তি, nameসম্পত্তি এবং setPositionফাংশন সহ একটি শ্রেণি কল্পনা করুন :

class C
  private
    x, y  : Int
    _name : String
  public
    name        : String
    position    : (Int, Int)
    setPosition : (Int, Int)  C

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

data C = Obj { x, y   Int
             , _name  String }

আমাদের দুটি লেখা আছে। তারা বেশ তুচ্ছ:

position  C  (Int, Int)
position self = (x self, y self)

name  C  String
name self = _name self

এখন আমাদের কেবলমাত্র অবস্থানটি আপডেট করতে সক্ষম হতে হবে:

setPosition  C  (Int, Int)  C
setPosition self (newX, newY) = self { x = newX, y = newY }

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

coop  C  ((Int, Int), String, (Int, Int)  C)
coop self = (position self, name self, setPosition self)

টাইপ ((Int, Int), String, (Int, Int) → c)-for কোন c একটি functor -is, তাই coopফর্ম আমরা চাই আছে: Functor f ⇒ C → f C

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

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

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

অন্যান্য বিভাগ

এখনও অবধি, আমরা বীজগণিত এবং কয়লাজেব্রাকে হাসেল প্রকার হিসাবে বলেছি। একটি বীজগণিত τএকটি ফাংশন সহ কেবল একটি টাইপ f τ → τএবং একটি কোলজেব্রা τফাংশন সহ কেবল একটি প্রকার τ → f τ

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

আমরা কিছু বিভাগের জন্য একটি এফ-বীজগণিত সংজ্ঞায়িত করতে পারি C। প্রথমত, আমাদের F : C → Cএকটি ফান্টারের দরকার - এটি একটি এন্ডোফান্টর । (সকল Haskell, Functorগুলি আসলে থেকে endofunctors হয় Hask → Hask।) তারপর, একটি বীজগণিত শুধু একটি অবজেক্ট Aথেকে Cএকটি morphism সঙ্গে F A → A। একটি কয়লাজেব্রা ছাড়া একই A → F A

অন্যান্য বিভাগ বিবেচনা করে আমরা কী অর্জন করব? ঠিক আছে, আমরা বিভিন্ন প্রসঙ্গে একই ধারণা ব্যবহার করতে পারি। সোনার মতো। হাসকেলে, একটি মনাদ M ∷ ★ → ★তিনটি ক্রিয়াকলাপ সহ কিছু ধরণের :

map         β)  (M α  M β)
return    α  M α
join      M (M α)  M α

mapফাংশন শুধু সত্য যে একটি প্রমাণ Mএকটি Functor। সুতরাং আমরা বলতে পারি যে একটি মোনাড দুটি অপারেশন সহ কেবল একটি ফান্টেক্টর : returnএবং join

ফ্যাক্টররা নিজেদের মধ্যে একটি বিভাগ গঠন করে, যার মধ্যে তথাকথিত "প্রাকৃতিক রূপান্তর" হিসাবে তাদের মধ্যে আকার থাকে। একটি প্রাকৃতিক রূপান্তর একটি কাঠামোর কাঠামো সংরক্ষণের সময় একটি ফান্টরকে অন্য রূপান্তরিত করার একটি উপায় মাত্র। ধারণাটি ব্যাখ্যা করতে সহায়তা করার জন্য একটি দুর্দান্ত নিবন্ধ এখানে । এটি সম্পর্কে আলোচনা concat, যা কেবল joinতালিকার জন্য।

হাস্কেল ফান্টেক্টর সহ, দুটি ফান্টারের সংমিশ্রণটি নিজেই একটি ফান্টেক্টর। সিউডোকোডে আমরা এটি লিখতে পারি:

instance (Functor f, Functor g)  Functor (f  g) where
  fmap fun x = fmap (fmap fun) x

এটি আমাদের joinথেকে ম্যাপিং হিসাবে ভাবতে সহায়তা করে f ∘ f → f। ধরণ joinহয় ∀α. f (f α) → f α। স্বজ্ঞাতভাবে, আমরা দেখতে পারি যে সমস্ত ধরণের জন্য বৈধ কোনও ফাংশন কীভাবে αরূপান্তর হিসাবে বিবেচিত হতে পারে f

returnএকটি অনুরূপ রূপান্তর। এর ধরণ ∀α. α → f α। এটি দেখতে অন্যরকম αfun প্রথমটি কোনও ফান্টর "ইন" নয়! আনন্দের বিষয় হল, আমরা সেখানে একটি পরিচয় functor যোগ করে এই সমাধান করতে পারেন: ∀α. Identity α → f α। সুতরাং returnএকটি রূপান্তর হয় Identity → f

এখন আমরা কোনও মোনাড সম্পর্কে ভাবতে পারি ঠিক যেমন একটি বীজগণিত যা fঅপারেশন সহ কিছু ফান্টারের চারপাশে f ∘ f → fএবং Identity → f। এটিকে কি চেনা লাগছে না? এটি একটি মনোয়েডের সাথে খুব মিল, যা τঅপারেশনগুলির সাথে কিছু ধরণের ছিল τ × τ → τএবং () → τ

সুতরাং একটি monad ঠিক একটি monoid মত, পরিবর্তে আমাদের একটি ফান্টর আছে টাইপ না করে। এটি একই ধরণের বীজগণিত, কেবল একটি ভিন্ন বিভাগে। (এখান থেকেই "এন্ডোফান্টেক্টর বিভাগের মধ্যে একটি মোনাড কেবল একটি নিঃশব্দ" বাক্যাংশটি আমার জানা যতদূর থেকে আসে))

এখন, আমাদের এই দুটি অপারেশন রয়েছে: f ∘ f → fএবং Identity → f। সংশ্লিষ্ট কয়লাজেব্রা পেতে, আমরা কেবল তীরগুলি সরিয়ে ফেলি। এটি আমাদের দুটি নতুন অপারেশন দেয়: f → f ∘ fএবং f → Identity। উপরের মতো ভেরিয়েবল যুক্ত করে আমাদের ∀α. f α → f (f α)এবং প্রদান করে আমরা তাদেরকে হ্যাস্কেল প্রকারগুলিতে পরিণত করতে পারি ∀α. f α → α। এটি দেখতে কমোনাডের সংজ্ঞার মতোই দেখাচ্ছে:

class Functor f  Comonad f where
  coreturn  f α  α
  cojoin    f α  f (f α)

সুতরাং একটি comonad তারপর একটি হল coalgebra endofunctors বিভাগ ভিত্তিক হবে।


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

28
এটি একটি দুর্দান্ত ব্যাখ্যা।
এডওয়ার্ড কেএমইটিটি

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

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

8
এটাই ছিল মহাকাব্য শেষ!
jdinunzio

85

এফ-বীজগণিত এবং এফ-কোলজেব্রাগগুলি গাণিতিক কাঠামো যা ইন্ডাকটিভ টাইপগুলি (বা পুনরাবৃত্তিমূলক প্রকারগুলি ) সম্পর্কে যুক্তি প্রদানে সহায়ক

এফ algebras

আমরা প্রথম এফ-বীজগণিত দিয়ে শুরু করব। আমি যতটা সম্ভব সহজ হওয়ার চেষ্টা করব।

আমি অনুমান করি আপনি জানেন যে একটি পুনরাবৃত্তির ধরন কি। উদাহরণস্বরূপ, এটি পূর্ণসংখ্যার তালিকার জন্য একটি প্রকার:

data IntList = Nil | Cons (Int, IntList)

এটা স্পষ্ট যে এটি পুনরাবৃত্তি - প্রকৃতপক্ষে, এর সংজ্ঞা নিজেকে বোঝায়। এর সংজ্ঞাটিতে দুটি ডেটা কনস্ট্রাক্টর রয়েছে, যার নিম্নলিখিত ধরণের রয়েছে:

Nil  :: () -> IntList
Cons :: (Int, IntList) -> IntList

নোট করুন যে আমি প্রকারের Nilমতো লিখেছি () -> IntList, সহজভাবে নয় IntList। এগুলি আসলে তাত্ত্বিক দৃষ্টিকোণ থেকে সমতুল্য ধরণের, কারণ ()প্রকারের কেবলমাত্র একটি বাসিন্দা রয়েছে।

আমরা যদি আরও নির্ধারিত-তাত্ত্বিক উপায়ে এই ফাংশনগুলির স্বাক্ষরগুলি লিখি, আমরা পেয়ে যাব

Nil  :: 1 -> IntList
Cons :: Int × IntList -> IntList

যেখানে 1ইউনিট সেট (একটি উপাদান সহ সেট) এবং A × Bঅপারেশন হ'ল দুটি সেটের ক্রস প্রোডাক্ট Aএবং B(যা জোড়ার সেট (a, b)যেখানে aসমস্ত উপাদানগুলির মধ্য দিয়ে যায় Aএবং bসমস্ত উপাদানগুলির মধ্য দিয়ে যায় B)।

দুটি সেটের মিলন বিচ্ছিন্ন করা Aএবং Bএটি এমন একটি সেট A | Bযা সেটগুলির মিল {(a, 1) : a in A}এবং {(b, 2) : b in B}। মূলত এটি উভয়ই Aএবং সমস্ত উপাদানগুলির একটি সেট B, তবে এই উপাদানগুলির প্রত্যেকটির সাথে ' Aবা ' চিহ্নযুক্ত বা হিসাবে চিহ্নিত B, সুতরাং যখনই আমরা কোনও উপাদান বাছাই করি A | Bআমরা তত্ক্ষণাত বুঝতে পারি যে এই উপাদানটি এসেছে Aবা কোথা থেকে এসেছে B

আমরা 'যোগদান' Nilএবং Consফাংশন করতে পারি , সুতরাং সেগুলি সেটে কাজ করে একটি একক ফাংশন গঠন করবে 1 | (Int × IntList):

Nil|Cons :: 1 | (Int × IntList) -> IntList

প্রকৃতপক্ষে, যদি Nil|Consফাংশনটি ()মানটির সাথে প্রয়োগ করা হয় (যা স্পষ্টতই 1 | (Int × IntList)সেটটি অন্তর্গত ) তবে এটি এটির মতো আচরণ করে Nil; যদি Nil|Consকোনও ধরণের মান প্রয়োগ করা হয় (Int, IntList)(যেমন মানগুলি সেটে থাকে তবে 1 | (Int × IntList)এটি এর মতো আচরণ করে Cons

এখন অন্য একটি ডেটাটাইপ বিবেচনা করুন:

data IntTree = Leaf Int | Branch (IntTree, IntTree)

এটিতে নিম্নলিখিত নির্মাণকারী রয়েছে:

Leaf   :: Int -> IntTree
Branch :: (IntTree, IntTree) -> IntTree

যা একটি ফাংশনে যোগ দিতে পারে:

Leaf|Branch :: Int | (IntTree × IntTree) -> IntTree

এটি দেখা যায় যে এই joinedফাংশনগুলির উভয়েরই একই ধরণের রয়েছে: তারা উভয়ই দেখতে দেখতে একই রকম

f :: F T -> T

যেখানে Fএক ধরণের রূপান্তর হয় যা আমাদের ধরণের লাগে এবং আরও জটিল ধরণের দেয়, যা গঠিত xএবং |পরিচালনা করে, Tসম্ভবত অন্যান্য ধরণের ব্যবহার এবং ব্যবহার করে । উদাহরণস্বরূপ, নিম্নলিখিত হিসাবে দেখায় IntListএবং IntTree Fদেখায়:

F1 T = 1 | (Int × T)
F2 T = Int | (T × T)

আমরা তাত্ক্ষণিকভাবে লক্ষ্য করতে পারি যে কোনও বীজগণিতের ধরণ এভাবে লেখা যায়। প্রকৃতপক্ষে, এ কারণেই তাদের 'বীজগণিত' বলা হয়: এগুলি বিভিন্ন ধরণের 'যোগস' (ইউনিয়ন) এবং 'পণ্য' (ক্রস পণ্য) নিয়ে থাকে।

এখন আমরা এফ-বীজগণিত সংজ্ঞায়িত করতে পারি। এফ-বীজগণিতটি কেবল একটি জোড়া (T, f), যেখানে Tকিছু প্রকার এবং fএটি একটি ফাংশন f :: F T -> T। আমাদের উদাহরণগুলিতে এফ-বীজগণিতগুলি হ'ল (IntList, Nil|Cons)এবং (IntTree, Leaf|Branch)। তবে নোট করুন, যদিও এই ধরণের fক্রিয়াটি প্রতিটি এফের জন্য একই Tএবং fএগুলি স্বেচ্ছাসেবী হতে পারে। উদাহরণস্বরূপ, (String, g :: 1 | (Int x String) -> String)বা (Double, h :: Int | (Double, Double) -> Double)কিছু জন্য gএবং hরয়েছে সংশ্লিষ্ট এফ জন্য এফ algebras

এরপরে আমরা এফ-বীজগণিত হোমোর্ফিজমগুলি এবং তারপরে প্রাথমিক এফ-বীজগণিতগুলি প্রবর্তন করতে পারি , যার খুব দরকারী বৈশিষ্ট্য রয়েছে। আসলে (IntList, Nil|Cons)এটি প্রাথমিক এফ 1-বীজগণিত, এবং (IntTree, Leaf|Branch)এটি প্রাথমিক এফ 2-বীজগণিত। আমি এই শর্তাদি এবং বৈশিষ্ট্যগুলির সঠিক সংজ্ঞা উপস্থাপন করব না কারণ সেগুলি প্রয়োজনের চেয়ে আরও জটিল এবং বিমূর্ত।

তবুও, সত্য যে, বলুন, (IntList, Nil|Cons)এফ-বীজগণিত আমাদের foldএই ধরণের উপর পছন্দ মত ফাংশন সংজ্ঞায়িত করতে দেয় । আপনি জানেন যে, ভাঁজ এক ধরণের অপারেশন যা কিছু সীমাবদ্ধ মানটিতে একটি পুনরাবৃত্ত ডাটাটাইপকে রূপান্তর করে। উদাহরণস্বরূপ, আমরা পূর্ণসংখ্যার একটি তালিকাকে একক মানতে ফোল্ড করতে পারি যা তালিকার সমস্ত উপাদানগুলির যোগফল:

foldr (+) 0 [1, 2, 3, 4] -> 1 + 2 + 3 + 4 = 10

যে কোনও পুনরাবৃত্তির ডেটাটাইপতে এ জাতীয় অপারেশনটিকে সাধারণকরণ করা সম্ভব।

নিম্নলিখিত foldrফাংশনের স্বাক্ষর :

foldr :: ((a -> b -> b), b) -> [a] -> b

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

foldr ((+), 0) :: [Int] -> Int

আমরা দেখতে পাচ্ছি যে এটি একটি ফাংশন যা পূর্ণসংখ্যার একটি তালিকা নেয় এবং একটি একক পূর্ণসংখ্যা ফেরত দেয়। আসুন আমাদের IntListধরণের ক্ষেত্রে এই জাতীয় ফাংশন সংজ্ঞায়িত করা যাক ।

sumFold :: IntList -> Int
sumFold Nil         = 0
sumFold (Cons x xs) = x + sumFold xs

আমরা দেখি এই ফাংশন দুটি অংশ নিয়ে গঠিত যে: প্রথম পক্ষ থেকে এই ফাংশন আচরণ সংজ্ঞায়িত Nilঅংশ IntList, এবং দ্বিতীয় পক্ষ থেকে ফাংশনের আচরণ সংজ্ঞায়িত Consঅংশ।

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

reductor :: () | (Int × Int) -> Int
reductor ()     = 0
reductor (x, s) = x + s

এটি দেখা যায় যে এফ-বীজগণিতের সংজ্ঞা অনুসারে, এটি reductorটাইপের একটি ফাংশন F1 Int -> Int! আসলে, এই জুটি (Int, reductor)একটি F1-বীজগণিত bra

কারণ IntListএকটি প্রাথমিক এফ 1-বীজগণিত, প্রতিটি প্রকারের Tজন্য এবং প্রতিটি ফাংশনের জন্য r :: F1 T -> Tএকটি ফাংশন রয়েছে, যার জন্য ক্যাটামোর্ফিজম নামে পরিচিত r, যা রূপান্তরিত IntListহয় Tএবং এই জাতীয় ক্রিয়াটি অনন্য। প্রকৃতপক্ষে, আমাদের উদাহরণে একটি catamorphism reductorহয় sumFold। কিভাবে reductorএবং sumFoldঅনুরূপ নোট করুন : তাদের প্রায় একই কাঠামো আছে! ইন reductorসংজ্ঞা sপ্যারামিটার ব্যবহার (টাইপ যার অনুরূপ Tএর গণনার ফল ব্যবহারের সাথে সঙ্গতিপূর্ণ) sumFold xsমধ্যে sumFoldসংজ্ঞা।

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

(append [4, 5, 6]) [1, 2, 3] = (foldr (:) [4, 5, 6]) [1, 2, 3] -> [1, 2, 3, 4, 5, 6]

এটি আমাদের দেখতে কেমন IntList:

appendFold :: IntList -> IntList -> IntList
appendFold ys ()          = ys
appendFold ys (Cons x xs) = x : appendFold ys xs

আবার, রিডাক্টরটি লেখার চেষ্টা করি:

appendReductor :: IntList -> () | (Int × IntList) -> IntList
appendReductor ys ()      = ys
appendReductor ys (x, rs) = x : rs

appendFoldappendReductorরূপান্তর IntListহয় যার জন্য রূপান্তরিত হয় IntList

সুতরাং, মূলত, এফ-বীজগণিতগুলি আমাদের পুনরাবৃত্তির উপাত্তাস্ত্রগুলিতে 'ভাঁজ' সংজ্ঞায়িত করার অনুমতি দেয়, অর্থাত্ যে ক্রিয়াকলাপগুলি আমাদের কাঠামোগুলিকে কিছুটা মূল্য হ্রাস করে।

এফ coalgebras

এফ-কয়লাজেব্রাসগুলি এফ-বীজগণিতগুলির জন্য তথাকথিত 'দ্বৈত' শব্দ। তারা আমাদের unfoldsপুনরাবৃত্তির ডেটাটাইপগুলির জন্য সংজ্ঞা দিতে দেয় , এটি হ'ল কিছু মান থেকে রিকার্সিভ স্ট্রাকচার তৈরির উপায়।

ধরুন আপনার নিম্নলিখিত ধরণের রয়েছে:

data IntStream = Cons (Int, IntStream)

এটি পূর্ণসংখ্যার এক অসীম প্রবাহ। এর একমাত্র নির্মাতার নিম্নলিখিত ধরণের রয়েছে:

Cons :: (Int, IntStream) -> IntStream

অথবা, সেটের ক্ষেত্রে

Cons :: Int × IntStream -> IntStream

হাস্কেল আপনাকে ডেটা কনস্ট্রাক্টরের সাথে প্যাটার্ন ম্যাচ করার অনুমতি দেয়, যাতে আপনি নিম্নলিখিত ফাংশনগুলিকে এস এ কাজ করতে পারেন IntStream:

head :: IntStream -> Int
head (Cons (x, xs)) = x

tail :: IntStream -> IntStream
tail (Cons (x, xs)) = xs

আপনি স্বাভাবিকভাবে এই ফাংশনগুলিকে টাইপের একক ফাংশনে 'যোগদান' করতে পারেন IntStream -> Int × IntStream:

head&tail :: IntStream -> Int × IntStream
head&tail (Cons (x, xs)) = (x, xs)

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

g :: T -> F T

যেখানে Tকিছু ধরণের। এখন থেকে আমরা সংজ্ঞায়িত করব

F1 T = Int × T

এখন, এফ-কয়লাজেব্রা একটি জুড়ি (T, g), যেখানে Tএক ধরণের এবং gটাইপের ফাংশন g :: T -> F T। উদাহরণস্বরূপ, (IntStream, head&tail)একটি এফ 1-কয়লাজেব্রা। আবার, ঠিক যেমন এফ-বীজগণিতগুলিতে, gএবং Tযথেচ্ছ হতে পারে, উদাহরণস্বরূপ, (String, h :: String -> Int x String)কিছু এইচ এর জন্য এফ 1-কয়লাজেব্রাও।

সমস্ত এফ-কয়লাজেব্রাগুলির মধ্যে তথাকথিত টার্মিনাল এফ-কয়লাজেব্রা রয়েছে , যা প্রাথমিক এফ-বীজগণিতগুলির দ্বৈত। উদাহরণস্বরূপ, IntStreamএকটি টার্মিনাল এফ-কয়লাজেব্রা। এর অর্থ হ'ল প্রতিটি ধরণের Tজন্য এবং প্রতিটি ফাংশনের জন্য p :: T -> F1 Tএকটি ফাংশন রয়েছে যার নাম অ্যানামরফিজম , যা রূপান্তর Tকরে IntStream, এবং এই জাতীয় ফাংশনটি অনন্য।

নিম্নলিখিত ফাংশনটি বিবেচনা করুন, যা প্রদত্ত একটি থেকে শুরু করে ধারাবাহিক পূর্ণসংখ্যার একটি স্ট্রিম উত্পন্ন করে:

nats :: Int -> IntStream
nats n = Cons (n, nats (n+1))

এখন একটি ফাংশন পরিদর্শন দিন natsBuilder :: Int -> F1 Int, যে, natsBuilder :: Int -> Int × Int:

natsBuilder :: Int -> Int × Int
natsBuilder n = (n, n+1)

আবার, আমরা natsএবং এর মধ্যে কিছু মিল খুঁজে পেতে পারি natsBuilder। এটি আমরা সংযোগের সাথে খুব কমই এর আগে একই সাথে রিডাক্টর এবং ভাঁজগুলির সাথে পর্যবেক্ষণ করেছি। natsজন্য anamorphism হয় natsBuilder

আর একটি উদাহরণ, একটি ফাংশন যা একটি মান এবং একটি ফাংশন নেয় এবং ফাংশনের ক্রমাগত প্রয়োগগুলির একটি স্ট্রিমকে মানটিতে ফেরত দেয়:

iterate :: (Int -> Int) -> Int -> IntStream
iterate f n = Cons (n, iterate f (f n))

এর বিল্ডার ফাংশনটি নিম্নলিখিত একটি:

iterateBuilder :: (Int -> Int) -> Int -> Int × Int
iterateBuilder f n = (n, f n)

তারপরে iterateএটি একটি অ্যানোরমিজম iterateBuilder

উপসংহার

সুতরাং, সংক্ষেপে, এফ-বীজগণিতগুলি ভাঁজগুলি সংজ্ঞায়িত করার অনুমতি দেয়, অর্থাৎ অপারেশনগুলি যা পুনরাবৃত্ত কাঠামোকে একটি একক মানের মধ্যে হ্রাস করে এবং এফ-কয়লাজেব্রারা বিপরীতে এটি করতে দেয়: একক মান থেকে একটি [সম্ভাব্য] অসীম কাঠামো তৈরি করে।

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

আশাকরি এটা সাহায্য করবে.


এর ধরণ এবং সংজ্ঞাটি appendReductorকিছুটা অদ্ভুত দেখাচ্ছে এবং সত্যিই আমাকে সেখানকার প্যাটার্নটি দেখতে সহায়তা করে নি ... :) আপনি কি এটি সঠিক কিনা ডাবল-চেক করতে পারেন? .. রিডাক্টরের ধরনগুলি সাধারণভাবে দেখতে কেমন হওয়া উচিত? rসেখানে সংজ্ঞা অনুসারে , F1ইন্টারলিস্ট দ্বারা নির্ধারিত হয়, বা এটি একটি নির্বিচারে এফ?
সর্বাধিক গালকিন

37

টিউটোরিয়াল পেপারের মধ্য দিয়ে যাচ্ছি (কো) বীজগণিত এবং (কো) প্রবর্তনের উপর একটি টিউটোরিয়াল আপনাকে কম্পিউটার বিজ্ঞানের কো-বীজগণিত সম্পর্কে কিছুটা অন্তর্দৃষ্টি দেবে।

আপনাকে বোঝানোর জন্য নীচে এটির একটি উদ্ধৃতি দেওয়া হল,

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


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

ফান্টেক্টর কী? এটি এক সেট থেকে অন্য সেট এ রূপান্তর যা তাদের কাঠামো সংরক্ষণ করে। (আরও তথ্যের জন্য নেটটিতে অনেক ভাল বর্ণনা রয়েছে)।

একটি এফ-বীজগণিত কি? এটি ফান্টারের বীজগণিত। এটি কেবল ফান্টারের সর্বজনীন স্বত্বের অধ্যয়ন।

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

এফ-কো-বীজগণিত কেন? প্রোগ্রামগুলি সংক্ষেপে দ্বৈত হয় কারণ তারা তথ্য দ্বারা বর্ণিত হয় এবং তারা এতে কাজ করে। তারপরে মূলত যা তথ্য রচনা করে এবং সেগুলি পরিবর্তন করে সেগুলি দুটি উপায়ে দেখা যেতে পারে।

  • ডেটা যা প্রোগ্রাম দ্বারা প্রক্রিয়াজাত তথ্য হিসাবে সংজ্ঞায়িত করা যেতে পারে।
  • স্টেট যা প্রোগ্রাম দ্বারা ভাগ করা তথ্য হিসাবে সংজ্ঞায়িত করা যেতে পারে।

তারপরে এই পর্যায়ে, আমি এটি বলতে চাই,

  • এফ-বীজগণিত হ'ল ডেটা ইউনিভার্সের উপরে অভিনয় করা ফান্টোরাল ট্রান্সফর্মেশন অধ্যয়ন (যেমন এখানে সংজ্ঞায়িত করা হয়েছে)।
  • এফ-কো-বীজগণিতগুলি হ'ল স্টেটের ইউনিভার্সে অভিনীত ফান্টোরাল ট্রান্সফর্মেশন অধ্যয়ন (যেমন এখানে সংজ্ঞায়িত করা হয়েছে)।

একটি প্রোগ্রামের জীবনে ডেটা এবং রাষ্ট্রের সহাবস্থান থাকে এবং তারা একে অপরকে সম্পূর্ণ করে complete তারা দ্বৈত হয়।


5

আমি স্পষ্টভাবে প্রোগ্রামিং-সম্পর্কিত এমন স্টাফ দিয়ে শুরু করব এবং এরপরে কংক্রিটের মতো এবং ডাউন-টু-আর্থকে রাখতে পারার জন্য কিছু গণিতের জিনিস যুক্ত করব।


আসুন কয়েকটি কম্পিউটার-বিজ্ঞানীকে কন্ডিশনে নিয়ে উদ্ধৃত করি…

http://www.cs.umd.edu/~micinski/posts/2012-09-04-on-understanding-coinduction.html

আনয়ন সীমাবদ্ধ ডেটা সম্পর্কে, সহ-অন্তর্ভুক্তি অসীম ডেটা সম্পর্কে।

অসীম তথ্যের সাধারণ উদাহরণটি অলস তালিকার ধরণ (একটি স্ট্রিম)। উদাহরণস্বরূপ, আসুন আমরা বলতে পারি যে মেমরিতে আমাদের নিম্নোক্ত বস্তু রয়েছে:

 let (pi : int list) = (* some function which computes the digits of
 π. *)

কম্পিউটার সমস্ত of ধরে রাখতে পারে না, কারণ এতে কেবল সীমাবদ্ধ পরিমাণ মেমরি থাকে! তবে এটি যা করতে পারে তা হ'ল একটি সীমাবদ্ধ কর্মসূচি, যা আপনার ইচ্ছার যে কোনও ইচ্ছামত দীর্ঘ প্রসার ঘটায়। যতক্ষণ আপনি কেবল তালিকার সসীম টুকরা ব্যবহার করেন ততক্ষণ আপনি সেই অসীম তালিকার সাথে যতটা প্রয়োজন তেমন হিসাব করতে পারেন।

তবে, নিম্নলিখিত প্রোগ্রামটি বিবেচনা করুন:

let print_third_element (k : int list) =   match k with
     | _ :: _ :: thd :: tl -> print thd


 print_third_element pi

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

http://adam.chlipala.net/cpdt/html/Coinductive.html

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

http://www.alexandrasilva.org/#/talks.html আলেকজান্দ্রা সিলভা দ্বারা কলিজার উদাহরণ


সাধারণ প্রোগ্রামিং কার্যগুলিতে পরিবেষ্টিত গাণিতিক প্রসঙ্গটি সম্পর্কিত

"একটি বীজগণিত" কী?

বীজগণিত কাঠামো সাধারণত:

  1. জিনিসপত্র
  2. স্টাফ কি করতে পারে

এটিতে 1. বৈশিষ্ট্য এবং 2. পদ্ধতিযুক্ত বস্তুর মতো শব্দ হওয়া উচিত। বা আরও ভাল, এটি স্বাক্ষর প্রকারের মতো হওয়া উচিত।

স্ট্যান্ডার্ড গাণিতিক উদাহরণগুলির মধ্যে মনোয়েড ⊃ গোষ্ঠী ⊃ ভেক্টর-স্পেস। "একটি বীজগণিত" অন্তর্ভুক্ত রয়েছে। মনোয়েডগুলি অটোমাতার মতো: ক্রিয়াপদের ক্রম (যেমন, f.g.h.h.nothing.f.g.f)। এমন একটি gitলগ যা সর্বদা ইতিহাস যুক্ত করে এবং এটি কখনই মুছে না তা একরকম হবে তবে একটি দল নয়। যদি আপনি বিপরীতগুলি যুক্ত করেন (যেমন negativeণাত্মক সংখ্যা, ভগ্নাংশ, শিকড়, সঞ্চিত ইতিহাস মুছে ফেলা, একটি ভাঙা আয়না অচল করে দেওয়া) আপনি একটি গোষ্ঠী পাবেন।

গোষ্ঠীতে এমন জিনিস থাকে যা একসাথে যুক্ত বা বিয়োগ করা যায়। উদাহরণস্বরূপ Durations একসাথে যুক্ত করা যেতে পারে। (তবে Dateতা পারে না)) সময়সীমাগুলি ভেক্টর স্পেসে থাকে (কেবল একটি গ্রুপ নয়) কারণ বাইরের সংখ্যার দ্বারা সেগুলিও ছোট করে দেওয়া যেতে পারে। (এর একটি স্বাক্ষর scaling :: (Number,Duration) → Duration।)

বীজগণিত ⊂ ভেক্টর-স্পেসগুলি আরও একটি জিনিস করতে পারে: কিছু আছে m :: (T,T) → T। এই "গুণ" বা কল করুন না কারণ আপনি একবার ছেড়ে গেলে Integers"গুণন" (বা "ক্ষতচিহ্ন" ) কী হওয়া উচিত তা কম স্পষ্ট হয় ।

(এই জন্যই মানুষ (ক্যাটাগরি-তত্ত্বীয়) সার্বজনীন বৈশিষ্ট্য দেখুন: তাদের বলতে গুণ কি করা উচিত না বা মত হতে :

পণ্য সর্বজনীন সম্পত্তি )


বীজগণিত → কলজেব্রাস

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

কাউন্টিটটি সাধারণত ট্রেস (তির্যক এন্ট্রিগুলির যোগফল) হয়, যদিও আবার গুরুত্বপূর্ণ বিষয়টি হ'ল আপনার কাউন্টারটি কী করে ; traceম্যাট্রিক্সের জন্য কেবল একটি ভাল উত্তর।

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


টেমিং (আনইন) কাঠামোগত ডেটা

গণিতবিদরা হয়তো টিকিউএফটি-র মতো মজাদার কিছু মডেল করছেন , যেখানে প্রোগ্রামারদের সাথে কুস্তি করতে হয়

  • তারিখ / সময় ( + :: (Date,Duration) → Date),
  • স্থানগুলি ( Paris(+48.8567,+2.3508)! এটি একটি বিন্দু নয়, একটি আকার।)
  • কাঠামোগত JSON যা কিছু দিক থেকে সুসংগত বলে মনে করা হচ্ছে,
  • ভুল-তবে-বন্ধ এক্সএমএল,
  • অবিশ্বাস্যরকম জটিল জিআইএস ডেটা যা বুদ্ধিমান সম্পর্কের বোঝা পূরণ করতে পারে,
  • নিয়মিত এক্সপ্রেশন যা আপনার কাছে কিছু বোঝায় তবে তার অর্থ পার্ল থেকে কম less
  • সিআরএম যা সমস্ত এক্সিকিউটিভের ফোন নম্বর এবং ভিলা অবস্থানগুলি, তার (এখন প্রাক্তন) স্ত্রী এবং বাচ্চাদের নাম, জন্মদিন এবং পূর্ববর্তী সমস্ত উপহার রাখা উচিত, যার প্রত্যেকটির "স্পষ্ট" সম্পর্ক (গ্রাহকের কাছে সুস্পষ্ট) সন্তুষ্ট করা উচিত যা অবিশ্বাস্যভাবে কোড আপ করা শক্ত,
  • .....

কম্পিউটার বিজ্ঞানীরা, যখন কয়লাজেব্রার সম্পর্কে কথা বলছেন, সাধারণত কার্টেসিয়ান পণ্যগুলির মতো মনের মধ্যে সেট-ইশ অপারেশন রাখেন। আমি বিশ্বাস করি যখন লোকেরা "হাস্কেলের বীজগণিত হ'ল" এর মত বলার অর্থ এটিই ছিল। কিন্তু কিছুদূর প্রোগ্রামারদের জটিল মত ডেটা-ধরনের মডেল আছে যে Place, Date/Timeএবং Customer-আর ঐ মডেলের বাস্তব জগতে মতো (বা অন্তত বাস্তব জগতের শেষ ব্যবহারকারীর দৃশ্য) হিসাবে হিসাবে বানাতে সম্ভব-আমি duals বিশ্বাস করি, শুধুমাত্র সেট-ওয়ার্ল্ডের বাইরেও কার্যকর হতে পারে।

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