সূচক মোনাড কী?


98

ইনডেক্সড মোনাড এবং এই মোনাডের অনুপ্রেরণা কী ?

আমি পড়েছি এটি পার্শ্বপ্রতিক্রিয়ার উপর নজর রাখতে সহায়তা করে। তবে স্বাক্ষর এবং ডকুমেন্টেশন টাইপ আমাকে কোথাও নিয়ে যায় না।

এটি কীভাবে পার্শ্ব প্রতিক্রিয়াগুলি (বা অন্য কোনও বৈধ উদাহরণ) ট্র্যাক রাখতে সহায়তা করতে পারে তার উদাহরণ কী হবে?

উত্তর:


123

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

প্রথমত, আসুন পরীক্ষা করা যাক।

IxMonad (m :: state -> state -> * -> *)

এটি হ'ল "গণনা" (বা "ক্রিয়া" টাইপ, আপনি যদি পছন্দ করেন তবে আমি "গণনা" দিয়ে থাকব), দেখে মনে হচ্ছে

m before after value

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

সাধারণ বিটস এবং টুকরাগুলি *মোনাডের মতো এবং stateডমিনোস খেলার মতো।

ireturn  ::  a -> m i i a    -- returning a pure value preserves state
ibind    ::  m i j a ->      -- we can go from i to j and get an a, thence
             (a -> m j k b)  -- we can go from j to k and get a b, therefore
             -> m i k b      -- we can indeed go from i to k and get a b

"ক্লাইসলি তীর" (ফাংশন যা গণনা দেয়) এর ধারণাটি এটি

a -> m i j b   -- values a in, b out; state transition i to j

এবং আমরা একটি রচনা পেতে

icomp :: IxMonad m => (b -> m j k c) -> (a -> m i j b) -> a -> m i k c
icomp f g = \ a -> ibind (g a) f

এবং, বরাবরের মতো আইনগুলি হুবহু তা নিশ্চিত করে ireturnএবং icompআমাদের একটি বিভাগ দেয়

      ireturn `icomp` g = g
      f `icomp` ireturn = f
(f `icomp` g) `icomp` h = f `icomp` (g `icomp` h)

বা, কৌতুক জাল সি / জাভা / যাই হোক না কেন,

      g(); skip = g()
      skip; f() = f()
{g(); h()}; f() = h(); {g(); f()}

কেন বিরক্ত হও? মিথস্ক্রিয়া "নিয়ম" মডেল। উদাহরণস্বরূপ, ড্রাইভের মধ্যে একটি না থাকলে আপনি ডিভিডি বের করতে পারবেন না এবং এর মধ্যে ইতিমধ্যে যদি কোনও ডিভিডি থাকে তবে আপনি ড্রাইভের মধ্যে ডিভিডি রাখতে পারবেন না। তাই

data DVDDrive :: Bool -> Bool -> * -> * where  -- Bool is "drive full?"
  DReturn :: a -> DVDDrive i i a
  DInsert :: DVD ->                   -- you have a DVD
             DVDDrive True k a ->     -- you know how to continue full
             DVDDrive False k a       -- so you can insert from empty
  DEject  :: (DVD ->                  -- once you receive a DVD
              DVDDrive False k a) ->  -- you know how to continue empty
             DVDDrive True k a        -- so you can eject when full

instance IxMonad DVDDrive where  -- put these methods where they need to go
  ireturn = DReturn              -- so this goes somewhere else
  ibind (DReturn a)     k  = k a
  ibind (DInsert dvd j) k  = DInsert dvd (ibind j k)
  ibind (DEject j)      k  = DEject j $ \ dvd -> ibind (j dvd) k

এটি জায়গায়, আমরা "আদিম" কমান্ডগুলি সংজ্ঞায়িত করতে পারি

dInsert :: DVD -> DVDDrive False True ()
dInsert dvd = DInsert dvd $ DReturn ()

dEject :: DVDrive True False DVD
dEject = DEject $ \ dvd -> DReturn dvd

যা থেকে অন্যরা একত্রিত হয় ireturnএবং ibind। এখন, আমি লিখতে পারি (ধার- doনোটেশন)

discSwap :: DVD -> DVDDrive True True DVD
discSwap dvd = do dvd' <- dEject; dInsert dvd ; ireturn dvd'

তবে শারীরিকভাবে অসম্ভব নয়

discSwap :: DVD -> DVDDrive True True DVD
discSwap dvd = do dInsert dvd; dEject      -- ouch!

বিকল্পভাবে, কেউ সরাসরি নিজের আদিম আদেশগুলি সংজ্ঞায়িত করতে পারে

data DVDCommand :: Bool -> Bool -> * -> * where
  InsertC  :: DVD -> DVDCommand False True ()
  EjectC   :: DVDCommand True False DVD

এবং তারপরে জেনেরিক টেম্পলেটটি ইনস্ট্যান্ট করুন

data CommandIxMonad :: (state -> state -> * -> *) ->
                        state -> state -> * -> * where
  CReturn  :: a -> CommandIxMonad c i i a
  (:?)     :: c i j a -> (a -> CommandIxMonad c j k b) ->
                CommandIxMonad c i k b

instance IxMonad (CommandIxMonad c) where
  ireturn = CReturn
  ibind (CReturn a) k  = k a
  ibind (c :? j)    k  = c :? \ a -> ibind (j a) k

বাস্তবে, আমরা বলেছিলাম যে আদিম ক্লেস্লি তীরগুলি কী (এক "ডমিনো" কী), তারপরে তাদের উপর "গণনা অনুক্রমের" একটি উপযুক্ত ধারণা তৈরি করেছিলেন।

নোট করুন যে প্রতিটি সূচিকৃত মোনাডের জন্য m, "নো চেঞ্জ ডায়াগোনাল" m i iএকটি মোনাড তবে সাধারণভাবে m i jতা হয় না। তদ্ব্যতীত, মানগুলি সূচিকৃত হয় না তবে গণনাগুলি সূচিকৃত হয়, সুতরাং কোনও সূচকযুক্ত মোনাড কেবল অন্য কিছু বিভাগের জন্য ম্যানড ইনস্ট্যান্টিয়েটেডের সাধারণ ধারণা নয়।

এখন, ক্লাইসলি তীরের ধরণটি আবার দেখুন

a -> m i j b

আমরা জানি iযে শুরু করতে আমাদের অবশ্যই রাষ্ট্র হতে হবে এবং আমরা ভবিষ্যদ্বাণী করি যে কোনও ধারাবাহিকতা রাষ্ট্র থেকে শুরু হবে j। আমরা এই সিস্টেম সম্পর্কে অনেক কিছু জানি! এটি ঝুঁকিপূর্ণ অপারেশন নয়! আমরা যখন ড্রাইভে ডিভিডি রাখি তখন তা ভিতরে যায়! ডিভিডি ড্রাইভ প্রতিটি কমান্ডের পরে রাষ্ট্র কী তা সম্পর্কে কোনও মন্তব্য পায় না।

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

এর চেয়ে ভাল সরঞ্জাম কী?

type f :-> g = forall state. f state -> g state

class MonadIx (m :: (state -> *) -> (state -> *)) where
  returnIx    :: x :-> m x
  flipBindIx  :: (a :-> m b) -> (m a :-> m b)  -- tidier than bindIx

ভীতিজনক বিস্কুট? আসলেই নয়, দুটি কারণে। এক, এটা, কি একটা একসংখ্যা মত বরং আরো দেখায় কারণ এটি হয় একটি একসংখ্যা কিন্তু ওভার (state -> *)বদলে *। দুই, আপনি যদি ক্লিসলি তীরের ধরণের দিকে লক্ষ্য করেন,

a :-> m b   =   forall state. a state -> m b state

আপনি পূর্ব শর্ত সহ গণনা প্রকার পান abগুড ওল্ড হোয়ার লজিকের মতো আপনি এবং উত্তরোত্তর । প্রোগ্রাম লজিকসে যুক্তিগুলি কারি-হাওয়ার্ডের চিঠিপত্রটি অতিক্রম করতে এবং হাস্কেল ধরণের হয়ে উঠতে অর্ধ শতাব্দীর বেশি সময় নিয়েছে। প্রকারভেদে returnIx"আপনি যে কোনও পোস্টকন্ডিশন অর্জন করতে পারেন যা কেবল কিছু না করে", যা "এড়িয়ে যান" এর জন্য হোয়ের লজিক নিয়ম। সম্পর্কিত রচনাটি ";" এর জন্য হোয়ের লজিক নিয়ম।

এর ধরণ দেখে শেষ করা যাক bindIx সমস্ত কোয়ান্টিফায়ার রেখেছি finish

bindIx :: forall i. m a i -> (forall j. a j -> m b j) -> m b i

এই forallগুলি বিপরীত মেরুত্ব আছে। আমরা প্রাথমিক অবস্থা iএবং একটি গণনা যা iপোস্টকন্ডিশনের সাথে শুরু করতে পারি তা চয়ন করি a। বিশ্ব তার jপছন্দসই মধ্যবর্তী রাষ্ট্র চয়ন করে, তবে আমাদের অবশ্যই পোস্টকন্ডিশনের ধারণার প্রমাণ দিতে হবে bএবং এই জাতীয় কোনও রাজ্য থেকেই আমরা bধরে রাখতে পারি। সুতরাং, ধারাবাহিকভাবে, আমরা শর্ত অর্জন করতে পারিb রাষ্ট্র থেকেi । "পরে" রাজ্যে আমাদের খপ্পর ছেড়ে দিয়ে আমরা অনুমানযোগ্য গণনা মডেল করতে পারি ।

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


4
আপনি কীভাবে True/ Falseমানগুলিকে আর্গুমেন্ট হিসাবে টাইপ করতে পারেন DVDDrive? এটি কি কিছু এক্সটেনশন, বা বুলিয়ানরা এখানে আসলে টাইপ করে?
বার্গি

8
বার্গি @ বুড়িয়ানদের টাইপ স্তরে উপস্থিত করার জন্য "উত্তোলন" করা হয়েছে। এটি DataKindsএক্সটেনশনটি ব্যবহার করে এবং নির্ভর করে টাইপ করা ভাষাগুলিতে ব্যবহার করা সম্ভব ... ভাল, এটি সম্পূর্ণ জিনিস thing
জে আব্রাহামসন

আপনি উদাহরণস্বরূপ MonadIx, কিছুটা আরও প্রসারিত করতে পারেন ? এটি তাত্ত্বিক ভিত্তিতে আরও ভাল, বা ব্যবহারিক প্রয়োগের জন্য আরও ভাল?
খ্রিস্টান কনকল

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

4
যখন আপনি উত্তরে স্বরলিপিটি "ধার" করেন, তখন এটি কার্যকরভাবে বলা যায় যে এটি RebindableSyntaxএক্সটেনশনের সাথে আসলে বৈধ বাক্য গঠন । অন্যান্য প্রয়োজনীয় এক্সটেনশনের একটি উল্লেখ পূর্বোক্তর মতো সুন্দর হবেDataKinds
গিগা বাইট

46

সূচকযুক্ত মোনাডকে সংজ্ঞায়িত করার জন্য কমপক্ষে তিনটি উপায় রয়েছে যা আমি জানি।

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

আটকে

মোডের সূচকে ডিল করার জন্য বব আতির স্টাইলের ইনডেক্সেড মোনাডে 2 টি অতিরিক্ত পরামিতি নিয়ে কাজ করা উচিত।

এটির সাথে আপনি সংজ্ঞাটি পেয়ে যাবেন লোকেরা অন্যান্য উত্তরে আশেপাশে ছড়িয়ে পড়েছে:

class IMonad m where
  ireturn  ::  a -> m i i a
  ibind    ::  m i j a -> (a -> m j k b) -> m i k b

আমরা ইনডেক্সড কমোনাদ à লা অ্যাটকেও সংজ্ঞায়িত করতে পারি। আমি আসলে সেই থেকে বের মাইলেজ কত অনেক পাওয়া মধ্যে lensকোডবেস

ম্যাকব্রাইড

ইনডেক্সেড মোনাডের পরবর্তী রূপটি তাঁর কাগজ "আউটরেজাস ফর ফরচেনের ক্লাইসলি অ্যারোস" থেকে কনর ম্যাকব্রাইডের সংজ্ঞা । পরিবর্তে তিনি সূচকের জন্য একটি একক প্যারামিটার ব্যবহার করেন। এটি সূচকযুক্ত মোনাদ সংজ্ঞাটির পরিবর্তে চতুর আকার ধারণ করে।

যদি আমরা নীচে প্যারামিট্রিকটি ব্যবহার করে কোনও প্রাকৃতিক রূপান্তরকে সংজ্ঞায়িত করি

type a ~> b = forall i. a i -> b i 

তারপরে আমরা ম্যাকব্রাইডের সংজ্ঞাটি লিখতে পারি

class IMonad m where
  ireturn :: a ~> m a
  ibind :: (a ~> m b) -> (m a ~> m b)

এটি এটকের চেয়ে একেবারে পৃথক বোধ করে তবে এটি একটি সাধারণ মোনাডের মতো মনে হয়, একটি মনড তৈরির পরিবর্তে (m :: * -> *)আমরা এটি তৈরি করি (m :: (k -> *) -> (k -> *)

মজার বিষয় হল আপনি ম্যাকব্রাইডের থেকে চালিত ডেটা টাইপ ব্যবহার করে প্রকৃতপক্ষে অ্যাটির স্টাইলের ইনডেক্সড মোনাডকে পুনরুদ্ধার করতে পারবেন, যা ম্যাকব্রাইড তার অনিবার্য শৈলীতে বলেছিলেন যে আপনি "এটিকে" হিসাবে পড়া উচিত।

data (:=) :: a i j where
   V :: a -> (a := i) i

এখন আপনি যে কাজ করতে পারেন

ireturn :: IMonad m => (a := j) ~> m (a := j)

যা প্রসারিত হয়

ireturn :: IMonad m => (a := j) i -> m (a := j) i

কেবলমাত্র j = i হলেই আহ্বান জানানো যেতে পারে এবং তারপরে যত্ন সহকারে পড়া ibindআপনাকে আটকির মতোই ফিরিয়ে আনতে পারেibind । আপনাকে এই (: =) ডেটা স্ট্রাকচারের চারপাশে পাস করতে হবে তবে তারা এটকি উপস্থাপনাটির শক্তি পুনরুদ্ধার করে।

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

আরেকটি সুন্দর বিষয় হ'ল ম্যাকব্রাইডের সূচিকৃত ম্যানাদটি স্পষ্টতই একটি মোনাদ, এটি একটি ভিন্ন ফান্টারের বিভাগে কেবল একটি ম্যানাদ ad এটা তোলে থেকে functors শ্রেণী বিভাগের ওপর endofunctors উপর কাজ করে (k -> *)যাও (k -> *)বরং থেকে functors বিষয়শ্রেণীতে চেয়ে *থেকে *

একটি মজাদার অনুশীলন ম্যাকব্রাইড থেকে কীভাবে ইনডেক্সড কমোনাদের জন্য অ্যাটকি রূপান্তর করতে পারে তা নির্ধারণ করছে । আমি ব্যক্তিগতভাবে ম্যাকব্রাইডের কাগজে "এট কী" নির্মাণের জন্য 'এ্যাট' ডেটা টাইপ ব্যবহার করি। আমি আসলে আইসিএফপি ২০১৩-তে বব অ্যাটকের কাছে গিয়েছিলাম এবং উল্লেখ করেছি যে আমি তাকে "কোট" বানিয়েছি him তিনি দৃশ্যত বিরক্ত লাগছিল। আমার মাথায় লাইনটি আরও ভাল খেলেছে। =)

বাগান

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

https://github.com/dorchard/effect-monad/blob/master/docs/ixmonad-fita14.pdf


4
আমি কি ঠিক বলেছি যে অর্খার্ডের মনড অ্যাটকের সমতুল্য, যেমন আমরা পূর্বের থেকে শেষের দিকে এন্ডোমর্ফিিজম মনোয়েড নিয়ে যেতে পারি, এবং সিপিএসের এনকোডিংয়ের মাধ্যমে পিছন দিকে যেতে পারি রাষ্ট্রের ক্রান্তিকালে মনোয়েডাল সংযোজন?
আন্দ্রেস কোভিকস

এটা আমার কাছে প্রশংসনীয় মনে হচ্ছে।
এডওয়ার্ড কেএমইটিটি

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

4
"সাবধানতার সাথে পড়ার" উপর প্রসারিত করতে ibind: প্রকারের উপন্যাসটি পরিচয় করিয়ে দিন Atkey m i j a = m (a := j) imএটকের সংজ্ঞা হিসাবে এটি ব্যবহার করে আমরা যে দুটি স্বাক্ষর সন্ধান করেছি তা পুনরুদ্ধার করে: ireturnAtkin :: a -> m (a := i) iএবং ibindAtkin :: m (a := j) i -> (a -> m (b := k) j) -> m (b := k) i। প্রথম এক রচনা দ্বারা প্রাপ্ত হয়: ireturn . V। দ্বিতীয়টি (1) forall j. (a := j) j -> m (b := k) jপ্যাটার্ন মিলের সাহায্যে একটি ফাংশন তৈরি করে, তারপরে পুনরুদ্ধারটিকে aদ্বিতীয় আর্গুমেন্টে পাস করে ibindAtkin
ওয়ার্ল্ডসেন্ডার

23

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

blueToRed  :: State S ()
blueToBlue :: State S ()

foo :: State S ()
foo = do blueToRed
         blueToBlue

দ্বিতীয় ক্রিয়াটি নীল অবস্থার প্রত্যাশা করার পরে একটি রানটাইম ত্রুটি ট্রিগার করে। আমরা স্থিতিশীলভাবে এটি প্রতিরোধ করতে চাই। সূচক মোনাড এই লক্ষ্যটি পূরণ করে:

data Red
data Blue

-- assume a new indexed State monad
blueToRed  :: State S Blue Red  ()
blueToBlue :: State S Blue Blue ()

foo :: State S ?? ?? ()
foo = blueToRed `ibind` \_ ->
      blueToBlue          -- type error

এক ধরন ত্রুটি আলোড়ন কারণ দ্বিতীয় সূচি blueToRed( Red) এর প্রথম সূচক থেকে পৃথক blueToBlue( Blue)।

অন্য উদাহরণ হিসাবে, সূচিকৃত মনাদাসমূহের সাহায্যে আপনি কোনও রাজ্য মনডকে তার রাজ্যের জন্য ধরণের পরিবর্তন করতে অনুমতি দিতে পারেন, যেমন আপনি থাকতে পারেন

data State old new a = State (old -> (new, a))

আপনি স্টেটিক্যালি টাইপযুক্ত ভিন্ন ভিন্ন স্ট্যাকের একটি রাজ্য তৈরি করতে উপরের ব্যবহার করতে পারেন। অপারেশন টাইপ হবে

push :: a -> State old (a,old) ()
pop  :: State (a,new) new a

অন্য উদাহরণ হিসাবে, ধরুন আপনি একটি সীমাবদ্ধ আইও মনাদ চান যা ফাইল অ্যাক্সেসের অনুমতি দেয় না। আপনি যেমন ব্যবহার করতে পারে

openFile :: IO any FilesAccessed ()
newIORef :: a -> IO any any (IORef a)
-- no operation of type :: IO any NoAccess _

এইভাবে, IO ... NoAccess ()টাইপযুক্ত একটি ক্রিয়া স্থিতিশীলভাবে ফাইল-অ্যাক্সেস-মুক্ত থাকার গ্যারান্টিযুক্ত। পরিবর্তে, কোনও ধরণের ক্রিয়া IO ... FilesAccessed ()ফাইলগুলিতে অ্যাক্সেস করতে পারে। ইনডেক্সযুক্ত মোনাডের অর্থ হ'ল আপনাকে সীমাবদ্ধ আইওর জন্য আলাদা ধরণের নির্মাণ করতে হবে না, যার জন্য আইও উভয় প্রকারে নন-ফাইল সম্পর্কিত ফাংশনটি নকল করতে হবে।


19

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

একটি "স্ট্যান্ডার্ড" monadic মান Monad m => m aএকটি সূচকযুক্ত monad মধ্যে মান IndexedMonad m => m i j aযেখানে টাইপ iএবং jসূচক প্রকারের হয় তাই iএটি monadic গণনার শুরুতে এবং গণনার jশেষে সূচক টাইপ হয় । একরকমভাবে, আপনি iএক ধরণের ইনপুট টাইপ এবং jআউটপুট ধরণের হিসাবে ভাবতে পারেন ।

Stateএকটি উদাহরণ হিসাবে ব্যবহার করে , একটি State s aরাষ্ট্রীয় sগণনা সম্পূর্ণ গণনা জুড়ে একটি ধরণের অবস্থা বজায় রাখে এবং প্রকারের ফলাফল প্রদান করে a। একটি সূচক সংস্করণ,, IndexedState i j aএকটি রাষ্ট্রীয় গণনা যেখানে রাষ্ট্র গণনার সময় একটি ভিন্ন ধরণের রূপান্তর করতে পারে। প্রাথমিক অবস্থায় প্রকার iএবং রাজ্য থাকে এবং গণনার শেষে প্রকার থাকে j

একটি সাধারণ মোনাডের উপর একটি সূচকযুক্ত মোনাড ব্যবহার করা খুব কমই প্রয়োজন তবে এটি কিছু ক্ষেত্রে কঠোর স্ট্যাটিক গ্যারান্টিগুলি এনকোড করতে ব্যবহার করা যেতে পারে।


5

নির্ভরশীল প্রকারগুলিতে সূচকগুলি কীভাবে ব্যবহৃত হয় (যেমন আগদা তে) এক নজরে নেওয়া গুরুত্বপূর্ণ। এটি সূচকগুলি কীভাবে সাধারণভাবে সহায়তা করে তা ব্যাখ্যা করতে পারে, তারপরে এই অভিজ্ঞতাটি মনদেজে অনুবাদ করুন।

সূচকগুলি নির্দিষ্ট ধরণের উদাহরণগুলির মধ্যে সম্পর্ক স্থাপনের অনুমতি দেয়। তারপরে আপনি কিছু মূল্যবোধ সম্পর্কে যুক্তি স্থাপন করতে পারেন যে সম্পর্কটি ধরে রেখেছে কিনা establish

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

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

সূচকযুক্ত ম্যানডগুলি পার্শ্ব প্রতিক্রিয়াগুলি আরও স্পষ্টভাবে পরিচালনা করার জন্য নির্ভরশীল প্রকারের সিস্টেমগুলি থেকে কিছু এনকোড করার অনুমতি দেয়।

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