সর্বদা হিসাবে, পরিভাষা লোকেরা পুরোপুরি সামঞ্জস্যপূর্ণ নয়। বিভিন্ন অনুপ্রেরণা অনুসারে মনডস-তবে-কঠোরতার সাথে কথা বলার-তা নয় quite "ইনডেক্সড মোনাড" শব্দটি এমন একটি ধারণাকে চিহ্নিত করার জন্য ব্যবহৃত শর্তগুলির ("মোনাডিশ" এবং "প্যারামিটারাইজড মোনাড" (তাদের জন্য অ্যাটির নাম সহ) এর মধ্যে একটি is (যদি আপনি আগ্রহী হন তবে অন্য একটি ধারণাটি হ'ল কাটসুমাতার "প্যারামেট্রিক এফেক্ট মোনাড", এটি একটি মনোয়েড দ্বারা সূচিত, যেখানে রিটার্নটি নিরপেক্ষভাবে সূচিত হয় এবং তার সূচকগুলিতে আবদ্ধ হয়))
প্রথমত, আসুন পরীক্ষা করা যাক।
IxMonad (m :: state -> state -> * -> *)
এটি হ'ল "গণনা" (বা "ক্রিয়া" টাইপ, আপনি যদি পছন্দ করেন তবে আমি "গণনা" দিয়ে থাকব), দেখে মনে হচ্ছে
m before after value
কোথায় before, after :: state
এবং value :: *
। ধারণাটি হ'ল কোনও বাহ্যিক ব্যবস্থার সাথে নিরাপদে ইন্টারঅ্যাক্ট করার উপায়গুলি ক্যাপচার করা যা রাষ্ট্রটির কিছু অনুমানযোগ্য ধারণা রয়েছে। একটি গণনার ধরণ আপনাকে জানায় যে রাষ্ট্রটি কীভাবে চলতে হবে before
তা অবশ্যই চলবে, রাষ্ট্রটি কী চলবে after
তা এবং (যেমন নিয়মিত মনডসের সাথে *
) কী ধরণের value
গণনা উত্পাদন করে।
সাধারণ বিটস এবং টুকরাগুলি *
মোনাডের মতো এবং state
ডমিনোস খেলার মতো।
ireturn :: a -> m i i a
ibind :: m i j a ->
(a -> m j k b)
-> m i k b
"ক্লাইসলি তীর" (ফাংশন যা গণনা দেয়) এর ধারণাটি এটি
a -> m i j b
এবং আমরা একটি রচনা পেতে
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
DReturn :: a -> DVDDrive i i a
DInsert :: DVD ->
DVDDrive True k a ->
DVDDrive False k a
DEject :: (DVD ->
DVDDrive False k a) ->
DVDDrive True k a
instance IxMonad DVDDrive where
ireturn = DReturn
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
বিকল্পভাবে, কেউ সরাসরি নিজের আদিম আদেশগুলি সংজ্ঞায়িত করতে পারে
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)
ভীতিজনক বিস্কুট? আসলেই নয়, দুটি কারণে। এক, এটা, কি একটা একসংখ্যা মত বরং আরো দেখায় কারণ এটি হয় একটি একসংখ্যা কিন্তু ওভার (state -> *)
বদলে *
। দুই, আপনি যদি ক্লিসলি তীরের ধরণের দিকে লক্ষ্য করেন,
a :-> m b = forall state. a state -> m b state
আপনি পূর্ব শর্ত সহ গণনা প্রকার পান a
b
গুড ওল্ড হোয়ার লজিকের মতো আপনি এবং উত্তরোত্তর । প্রোগ্রাম লজিকসে যুক্তিগুলি কারি-হাওয়ার্ডের চিঠিপত্রটি অতিক্রম করতে এবং হাস্কেল ধরণের হয়ে উঠতে অর্ধ শতাব্দীর বেশি সময় নিয়েছে। প্রকারভেদে 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 আশা করি, এরপরে, এই উত্তরটি সূচকযুক্ত মনডগুলি কীসের ইঙ্গিত দেয়, যখন তারা কার্যকর হতে শুরু করবে এবং কখন বন্ধ হবে উভয়ের ভবিষ্যদ্বাণী করে।
True
/False
মানগুলিকে আর্গুমেন্ট হিসাবে টাইপ করতে পারেনDVDDrive
? এটি কি কিছু এক্সটেনশন, বা বুলিয়ানরা এখানে আসলে টাইপ করে?