মুক্ত মনাদ কি?


368

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


12
মোটামুটি ভাল ব্যাখ্যাটি এখানে রয়েছে haskellforall.com/2012/06/…
রজার লিন্ডজ

19
@ রোজার এই জাতীয় পৃষ্ঠা যা আমাকে এখানে এনেছে। আমার কাছে, সেই উদাহরণটি "ফ্রি" নামের একটি টাইপের জন্য একটি মোনাড উদাহরণকে সংজ্ঞায়িত করে এবং এটিই।
ডেভিড

উত্তর:


295

এডওয়ার্ড কেমেটের উত্তর অবশ্যই দুর্দান্ত। তবে, এটি কিছুটা প্রযুক্তিগত। এখানে সম্ভবত আরও অ্যাক্সেসযোগ্য ব্যাখ্যা।

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

liftFree :: Functor f => f a -> Free f a
foldFree :: Functor f => (f r -> r) -> Free f r -> r

এর মধ্যে প্রথমটি আপনাকে আপনার মনাদকে "intoুকতে" দেয় এবং দ্বিতীয়টি আপনাকে এটি থেকে "বেরিয়ে আসার" উপায় দেয়।

আরও সাধারণভাবে, যদি এক্স অতিরিক্ত কিছু স্টাফ পি সহ ওয়াই হয় তবে অতিরিক্ত কিছু না পেয়েই একটি "ফ্রি এক্স" হ'ল ওয়াই থেকে এক্স এ যাওয়ার উপায়।

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

সুতরাং

class Monoid m where
   mempty  :: m
   mappend :: m -> m -> m

এখন, আমরা সবাই তালিকা জানি

data [a] = [] | a : [a]

হ্যাঁ, tআমরা জানি যে কোনও প্রকারের [t]এটি একটি মায়োড

instance Monoid [t] where
  mempty   = []
  mappend = (++)

এবং সুতরাং তালিকাগুলি "ফ্রি মনয়েড" ওভার সেট (বা হাস্কেল প্রকারভেদে)।

ঠিক আছে, তাই বিনামূল্যে monads একই ধারণা। আমরা একটি ফান্টার নিয়েছি, এবং একটি মোনাড ফিরিয়ে দিই। প্রকৃতপক্ষে, যেহেতু মোনাডগুলি এন্ডোফান্টেক্টরগুলির বিভাগে মনোয়েড হিসাবে দেখা যায়, সুতরাং একটি তালিকার সংজ্ঞা

data [a] = [] | a : [a]

অনেকটা মুক্ত স্নাদের সংজ্ঞার মতো দেখাচ্ছে

data Free f a = Pure a | Roll (f (Free f a))

এবং উদাহরণগুলির তালিকাগুলির সাথে উদাহরণের সাথে Monadমিল রয়েছেMonoid

--it needs to be a functor
instance Functor f => Functor (Free f) where
  fmap f (Pure a) = Pure (f a)
  fmap f (Roll x) = Roll (fmap (fmap f) x)

--this is the same thing as (++) basically
concatFree :: Functor f => Free f (Free f a) -> Free f a
concatFree (Pure x) = x
concatFree (Roll y) = Roll (fmap concatFree y)

instance Functor f => Monad (Free f) where
  return = Pure -- just like []
  x >>= f = concatFree (fmap f x)  --this is the standard concatMap definition of bind

এখন, আমরা আমাদের দুটি অপারেশন পেতে

-- this is essentially the same as \x -> [x]
liftFree :: Functor f => f a -> Free f a
liftFree x = Roll (fmap Pure x)

-- this is essentially the same as folding a list
foldFree :: Functor f => (f r -> r) -> Free f r -> r
foldFree _ (Pure a) = a
foldFree f (Roll x) = f (fmap (foldFree f) x)

12
এটি আমি এখনও দেখেছি "ফ্রি" এর সর্বোত্তম ਪਹੁੰਚযোগ্য ব্যাখ্যা হতে পারে। বিশেষত অনুচ্ছেদটি "আরও সাধারণভাবে" দিয়ে শুরু হয়।
জন এল

16
আমি মনে করি এটি আকর্ষণীয় , Free f a = Pure a | Roll (f (Free f a))যেমনটি Free f a = a + fa + ffa + ..."চ কোনও সংখ্যার সাথে প্রয়োগ করা হয়েছে"। তারপরে concatFree(অর্থাত্ join) "f এ যে কোনও সংখ্যক বার প্রয়োগ করা হয়েছে (চ এর সাথে সংখ্যার সংখ্যক বার প্রয়োগ করা হয়েছে)" এবং দুটি নেস্টেড অ্যাপ্লিকেশনকে একটিতে ভেঙে দেয়। এবং >>="এফ কোনও সংখ্যক বার প্রয়োগ করেছে" এবং "কীভাবে একটি থেকে বি পেতে হবে (চ এর সাথে কোনও সংখ্যক বার প্রয়োগ করা হয়েছে)" নেয় এবং মূলত পূর্ববর্তীটির অভ্যন্তরের কোনওটির সাথে পরবর্তীটি প্রয়োগ করে এবং নীড় ভেঙে যায়। এখন আমি নিজেই পেয়েছি!
jkff

1
হয় concatFreeমূলত join?
rgrinberg

11
“এখানে সম্ভবত আরও অ্যাক্সেসযোগ্য ব্যাখ্যা is […] প্রকৃতপক্ষে, যেহেতু মোনাডগুলিকে এন্ডো ফ্যান্টেক্টর বিভাগে মনোয়েড হিসাবে দেখা যেতে পারে, ... "তবুও, আমি মনে করি এটি খুব ভাল উত্তর।
রূদ

2
<3 (আপনি এর প্রতি সংযোগ আছে উচিত "monads ইন্দো functors এর বিষয়শ্রেণীতে অন্তর্ভুক্ত monoids হিসেবে দেখা যেতে পারে" stackoverflow.com/a/3870310/1306877 কারণ প্রত্যেক haskeller সেই রেফারেন্স সম্পর্কে জানা উচিত!)
tlo

418

এখানে একটি আরও সহজ উত্তর: একটি Monad এমন কিছু যা "গণনা" করে যখন monadic প্রসঙ্গটি ভেঙে ফেলা হয় join :: m (m a) -> m a(প্রত্যাহার করে যা >>=সংজ্ঞায়িত করা যায় x >>= y = join (fmap y x))। মোনাডস গণনাগুলির ক্রমবর্ধমান শৃঙ্খলের মধ্য দিয়ে প্রসঙ্গটি বহন করে: কারণ সিরিজের প্রতিটি বিন্দুতে পূর্ববর্তী কল থেকে প্রসঙ্গটি পরবর্তীটির সাথে সঙ্কুচিত হয়।

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


8
আপনার অনুচ্ছেদগুলি ফিলিপের পোস্টে সত্যিই দুর্দান্ত সংযোজন করেছে।
ডেভিড

20
আমি এই উত্তরটি সত্যিই পছন্দ করি।
দানিদিয়াজ

5
বিনামূল্যে মোনাড মোনাড টাইপ শ্রেণি প্রতিস্থাপন করতে পারেন? এটি হ'ল, আমি কেবল ফ্রি মোনাডের রিটার্ন এবং বাইন্ড ব্যবহার করে কোনও প্রোগ্রাম লিখতে পারি এবং তারপরে আমি মাইবি বা তালিকা বা যেকোন কিছু পছন্দ করি না কেন ফলাফলগুলিতে যোগ দিতে পারি, বা এমনকি বাঁধা / সংঘবদ্ধ ফাংশন কলগুলির এক ক্রমের একাধিক মনডিক দৃষ্টিভঙ্গি তৈরি করতে পারি। নীচে এবং নির্বিঘ্ন উপেক্ষা করা, এটি হচ্ছে।
মিস্টারবি

2
এই উত্তরটি সাহায্য করেছিল, তবে আমি মনে করি এনআইসিটিটিএ কোর্সে 'যোগদান' না করায় এবং haskellforall.com/2012/06/… পড়তে না পারলে আমার বিভ্রান্তি হত । তাই আমার জন্যে, বোঝার কৌতুক পর্যন্ত এটি মধ্যে কুন্ড উত্তর অনেক পড়া (NICTA রেফারেন্স। Github.com/NICTA/course/blob/master/src/Course/Bind.hs )
মার্টিন Capodici

1
এই উত্তরটি সর্বকালের সেরা
Curycu

142

ফ্রি ফু হ'ল সহজ জিনিস যা সমস্ত 'ফু' আইনকে সন্তুষ্ট করে। এর অর্থ এটি foo হওয়ার জন্য প্রয়োজনীয় আইনগুলি যথাযথভাবে সন্তুষ্ট করে এবং অতিরিক্ত কিছু না।

একটি বিস্মৃত ফান্টেক্টর হ'ল এমন একটি যা কাঠামোর একটি অংশ "ভুলে যায়" কারণ এটি এক বিভাগ থেকে অন্য বিভাগে যায়।

Functors দেওয়া F : D -> C, এবং G : C -> D, আমরা বলতে F -| G, Fবাম adjoint হয় G, অথবা Gকরার অধিকার adjoint হয় Fযখনই forall A, B: F a -> bথেকে isomorphic হয়a -> G b , যেখানে তীর উপযুক্ত বিভাগ থেকে আসা।

আনুষ্ঠানিকভাবে, একটি ফ্রি ফ্যাক্টর একটি ভুলে যাওয়া ফান্টারের সাথে অ্যাডজাস্ট রেখে যায়।

ফ্রি মনয়েড

আসুন আমরা একটি মুক্ত উদাহরণ, একটি সহজ উদাহরণ দিয়ে শুরু করি।

একটি মনোয়েড নিন, যা কিছু ক্যারিয়ার সেট দ্বারা সংজ্ঞায়িত করা হয়েছে T, একত্রে উপাদানগুলির একত্রে ম্যাশ করার জন্য একটি বাইনারি ফাংশন f :: T → T → Tএবং এ unit :: T, যেমন আপনার একটি সহযোগী আইন এবং একটি পরিচয় আইন রয়েছে:f(unit,x) = x = f(x,unit)

আপনি একটি functor করতে পারেন Umonoids এর বিভাগ থেকে (যেখানে তীর monoid homomorphisms হয়, যে, তারা নিশ্চিত হয়ে নেন যে মানচিত্র unitথেকে unitঅন্যান্য monoid, এবং আপনি আগে বা অন্যান্য monoid করার ম্যাপিং পর অর্থ পরিবর্তন না করে রচনা করতে পারে) বিভাগের সেটগুলির (যেখানে তীরগুলি কেবল ফাংশন তীরগুলি থাকে) যা অপারেশন সম্পর্কে 'ভুলে যায়' এবংunit এবং আপনাকে ক্যারিয়ার সেট দেয়।

তারপরে, আপনি Fসেট ফটোগুলির সংযোজন রেখে যাওয়া মনোয়েডদের বিভাগে ফ্যাটাক্টরের সংজ্ঞা দিতে পারেন। সেই ফান্টেক্টর হ'ল ফান্টেক্টর যা aমনোয়েড [a], কোথায় unit = [], এবং একটি সেট মানচিত্র করেmappend = (++)

সুতরাং এখন পর্যন্ত আমাদের উদাহরণটি পর্যালোচনা করার জন্য সিউডো-হাস্কেল:

U : Mon  Set -- is our forgetful functor
U (a,mappend,mempty) = a

F : Set  Mon -- is our free functor
F a = ([a],(++),[])

তারপরে Fনিখরচায় প্রদর্শন করার জন্য, আমাদের এটি প্রদর্শন করতে হবে যে এটি Uএকটি বিস্মৃত ফান্টিকারকে রেখে দেওয়া হয়েছে, যা আমরা উপরে উল্লেখ করেছি, আমাদের এটি প্রদর্শন করা দরকার

F a → b isomorphic হয় a → U b

এখন, মনে রাখবেন এর লক্ষ্যটি মনোয়েডদের Fবিভাগে Monরয়েছে, যেখানে তীরগুলি মনোয়েড হোমোর্ফিজম হয়, সুতরাং আমাদের এটির একটি দেখাতে হবে যা থেকে কোনও মনোয়েড হোমোমর্ফিজম [a] → bএকটি ফাংশন দ্বারা সঠিকভাবে বর্ণনা করা যায় a → b

হাস্কেল-এ, আমরা এর পাশটিকে কল করি যা বাস করে Set(এর, Haskহাস্কেল ধরণের শ্রেণীর যেটি আমরা সেট করি সেট করা হয়) foldMap, যা কেবল Data.Foldableতালিকাগুলির তালিকাগুলিতে টাইপ থাকে Monoid m => (a → m) → [a] → m

এর ফলে এমন একটি পরিণতি ঘটে যা একটি অ্যাডজেকশন হওয়ার পরে অনুসরণ করে। লক্ষণীয় যে আপনি যদি ভুলে যান তবে নিখরচায় তৈরি করুন, তবে আবার ভুলে যান, ঠিক যেমনটি আপনি একবার ভুলে গিয়েছিলেন, এবং আমরা একে monadic যোগদানের জন্য তৈরি করতে ব্যবহার করতে পারি। যেহেতু UFUF~ U(FUF)~UF , এবং আমরা পরিচয় monoid homomorphism থেকে পাস করতে পারেন [a]করতে [a]isomorphism আমাদের ক্রোড়পত্র সংজ্ঞায়িত মাধ্যমে যে থেকে একটি তালিকা isomorphism পেতে [a] → [a]ধরনের একটি ফাংশন a -> [a], এবং এই মাত্র তালিকার জন্য দিকেই প্রত্যাবর্তন হবে।

আপনি এইগুলির সাথে এই পদগুলিতে একটি তালিকা বর্ণনা করে আরও সরাসরি রচনা করতে পারেন:

newtype List a = List (forall b. Monoid b => (a -> b) -> b)

ফ্রি মোনাড

সুতরাং কি ফ্রি মোনাড কী?

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

সুতরাং, এটি সাধারণত একটি মুক্ত মোনাডের ধারণার সাথে কীভাবে সম্পর্কিত কারণ এটি ব্যবহৃত হয়?

কিছু জানা একটি বিনামূল্যে একসংখ্যা হয়, Free fআপনি বলে যে থেকে একটি একসংখ্যা homomorphism দান Free f -> m, একই জিনিস (থেকে isomorphic) থেকে একটি প্রাকৃতিক রূপান্তর (ক functor homomorphism) দান হিসাবে f -> m। মনে রাখবেন F a -> bঅবশ্যই আইসমোর্ফিক হতে হবেa -> U b এফ functors করার ইউ ইউ এখানে ম্যাপ monads বাম adjoint আছি।

Freeআমি যে টাইপটি ব্যবহার করি তা হ'ল এফ হ'ল অন্তত আইসমোরফিক phfreeহ্যাকেশনে প্যাকেজে আইসোমরফিক।

আমরা এটি নির্ধারণ করে ফ্রি তালিকার জন্য উপরের কোডটির সাথে কঠোর সাদৃশ্য তৈরি করতে পারি

class Algebra f x where
  phi :: f x -> x

newtype Free f a = Free (forall x. Algebra f x => (a -> x) -> x)

কফ্রি কমোনাদস

আমরা একটি অনুরূপ কিছু তৈরি করতে পারি, ভুলে যাওয়া ফান্টারের ডান অ্যাডেজমেন্ট দেখে এটি উপস্থিত রয়েছে ধরে নিয়ে। একটি কফ্রি ফান্টেক্টর সহজ / ডান অ্যাডজেট / একটি ভুলে যাওয়া ফান্টারের কাছে, এবং প্রতিসামগ্রন্থ অনুসারে, কোনও কিছু জানা একটি কফ্রি কমোনাদ হ'ল সমান যে জেনে রাখা আছে যে একটি কমোনাদ হোমোর্মিজম থেকে w -> Cofree fপ্রাকৃতিক রূপান্তর দেওয়া একই জিনিস w -> f


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

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

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

3
@ সারাহ: কম্পিউটার তত্ত্ব এবং ল্যাম্বদা ক্যালকুলাস থার্মগুলিতে ভারী নয় এমন হ্যাসেল সম্পর্কে ডকুমেন্টেশন বা আইআরসি কথোপকথনটি এখনও দেখতে পেলাম।
পাওলো স্কার্ডাইন

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

72

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


আপনি সম্ভবত জানেন কি একটি একসংখ্যা এবং এতে প্রতিটি একসংখ্যা একটি নির্দিষ্ট (একসংখ্যা-আইনের প্রতি শ্রদ্ধাশীল) উভয় বাস্তবায়ন প্রয়োজন fmap+ + join+ + returnবা bind+ +return

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

এটি ফ্রি মোনাড (ডেটা স্ট্রাকচার) ব্যবহার করে করা যেতে পারে, যা ফান্টেক্টরকে (টাইপ) এমনভাবে আবৃত করে যাতে join হ্রাসের চেয়ে বরং সেই ফান্টারের স্ট্যাকিং থাকে।

আসল returnএবং joinআপনি ব্যবহার করতে চান, হ্রাস ফাংশন এখন পরামিতি হিসাবে দেওয়া যেতে পারে foldFree:

foldFree :: Functor f => (a -> b) -> (f b -> b) -> Free f a -> b
foldFree return join :: Monad m => Free m a -> m a

প্রকারগুলি ব্যাখ্যা করতে, আমরা এর Functor fসাথে Monad mএবং এর bসাথে প্রতিস্থাপন করতে পারি (m a):

foldFree :: Monad m => (a -> (m a)) -> (m (m a) -> (m a)) -> Free m a -> (m a)

8
এই উত্তরটি আমাকে এমন ধারণা দিয়েছে যে আমি বুঝতে পেরেছি তারা কীসের জন্য এমনকি কার্যকর হতে পারে।
ডেভিড

59

একটি হাস্কেল মুক্ত মোনাড ফ্যান্ট্যাক্টরদের একটি তালিকা। তুলনা করা:

data List a   = Nil    | Cons  a (List a  )

data Free f r = Pure r | Free (f (Free f r))

Pureসদৃশ Nilএবং Freeঅনুরূপ Cons। একটি মুক্ত মনাদ মানগুলির তালিকার পরিবর্তে ফান্টারের একটি তালিকা সঞ্চয় করে। প্রযুক্তিগতভাবে, আপনি একটি পৃথক ডেটা টাইপ ব্যবহার করে নিখরচায়িত প্রয়োগ করতে পারেন তবে যে কোনও বাস্তবায়ন উপরেরটি থেকে বিচ্ছিন্ন হওয়া উচিত।

যখনই আপনার কোনও বিমূর্ত সিনট্যাক্স ট্রি দরকার হয় আপনি ফ্রি মনাদ ব্যবহার করেন। নিখরচায় মোনাডের বেস ফান্টরটি সিনট্যাক্স গাছের প্রতিটি ধাপের আকার।

আমার পোস্ট , যা ইতিমধ্যে কেউ লিঙ্ক করেছেন, কীভাবে বিনামূল্যে মোনাড দিয়ে বিমূর্ত সিনট্যাক্স গাছ তৈরি করবেন তার বিভিন্ন উদাহরণ দেয়


6
আমি জানি আপনি সংজ্ঞা তৈরি করার চেয়ে সাদৃশ্য আঁকছিলেন, তবে একটি মুক্ত মনাদ অবশ্যই কোনও অর্থে ফান্টারের তালিকার সাথে সাদৃশ্য নয় । এটি মজাদার গাছের খুব কাছাকাছি।
টম এলিস

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

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

2
টমএলিস টেকনিক্যালি, এটি কেবলমাত্র তখনই আপনার গাছের বেস ফ্যাক্টর একটি পণ্য ফ্যাক্টর হয়। বেস ফ্যান্টেক্টর হিসাবে যখন আপনার একটি যোগফল রয়েছে তখন এটি স্ট্যাক মেশিনের সাথে আরও সাদৃশ্যপূর্ণ।
গ্যাব্রিয়েল গঞ্জালেজ

21

আমি মনে করি একটি সাধারণ কংক্রিট উদাহরণ সাহায্য করবে। মনে করুন আমাদের একটি ফান্টর রয়েছে

data F a = One a | Two a a | Two' a a | Three Int a a a

সুস্পষ্ট সঙ্গে fmap। তারপরে Free F aগাছের ধরণ যার পাতাগুলি টাইপ রয়েছেa যার নোড দ্বারা ট্যাগযুক্ত করা হয়েছে One, Two, Two'এবং ThreeOneনোডের একটি সন্তান রয়েছে Two- এবং Two'নোডের দুটি সন্তান রয়েছে এবং Threeনোডের তিনটি রয়েছে এবং একটিতে ট্যাগও রয়েছে Int

Free Fএকটি monad হয়। গাছের returnমানচিত্র xযা মান সহ কেবল একটি পাত xt >>= fপ্রতিটি পাতার দিকে তাকিয়ে গাছের সাথে প্রতিস্থাপন করে। পাতার যখন মূল্য yথাকে তখন গাছটি সেই পাতার পরিবর্তে f y

একটি চিত্রটি এটিকে আরও পরিষ্কার করে তোলে তবে সহজেই একটি আঁকার জন্য আমার কাছে সুবিধা নেই!


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

4
এমনকি ফান্টাকর একটি "সম ফান্টেক্টর" হলেও ফলস্বরূপ মুক্ত মোনাদ এখনও গাছের মতো। আপনি আপনার গাছে একাধিক ধরণের নোড দিয়ে শেষ করেছেন: আপনার যোগফলের প্রতিটি উপাদানের জন্য একটি। যদি আপনার "যোগফলগুলি" এক্স -> 1 + এক্স হয় তবে প্রকৃতপক্ষে আপনি একটি তালিকা পাবেন যা কেবলমাত্র গাছের অবনমিত।
টম এলিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.