পার্শ্ব-প্রতিক্রিয়া কেন হাস্কেলকে মনড হিসাবে মডেল করা হয়?


172

হাস্কেলের অপরিষ্কার গণনাকে কেন সোনাদির আদলে মডেল করা হয়েছে সে সম্পর্কে কেউ কি কিছু নির্দেশ দিতে পারেন?

আমি বলতে চাইছি মোনাড 4 টি অপারেশন সহ কেবল একটি ইন্টারফেস, সুতরাং এতে মডেলিংয়ের পার্শ্ব-প্রতিক্রিয়া যুক্তির কারণ কী ছিল?


15
মনড দুটি মাত্র অপারেশন সংজ্ঞায়িত করে।
দারিও

3
কিন্তু ফিরে এবং ব্যর্থ সম্পর্কে কি? ((>>)) এবং (>> =) এর সাথে
বোডাসিডো

55
দুটি অপারেশন হয় returnএবং (>>=)x >> yএকই x >>= \\_ -> y(যেমন এটি প্রথম যুক্তির ফলাফল উপেক্ষা করে)। আমরা কথা বলি না fail
pm

2
@ পোর্জেস কেন ব্যর্থ সম্পর্কে কথা বলবেন না? এটি সম্ভবত, পার্সার ইত্যাদিতে কিছুটা কার্যকর
বিকল্প

16
@monadic: failহয় Monadকারণ একটি ঐতিহাসিক দুর্ঘটনার বর্গ; এটা সত্যিই অন্তর্গত MonadPlus। খেয়াল করুন যে এর ডিফল্ট সংজ্ঞাটি অনিরাপদ।
জেবি।

উত্তর:


292

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

সুতরাং, একটি অপরিষ্কার ফাংশন জন্য

f' :: Int -> Int

আমরা বিবেচনাতে রিয়েল ওয়ার্ল্ড যুক্ত করি

f :: Int -> RealWorld -> (Int, RealWorld)
-- input some states of the whole world,
-- modify the whole world because of the side effects,
-- then return the new world.

তারপর fআবার খাঁটি। আমরা একটি প্যারামিট্রাইজড ডেটা টাইপ সংজ্ঞায়িত করি type IO a = RealWorld -> (a, RealWorld), সুতরাং আমাদের এতবার রিয়েলওয়ার্ড টাইপ করার দরকার নেই, এবং কেবল লিখতে পারি

f :: Int -> IO Int

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

"অপরিষ্কার" ফাংশনগুলির সংমিশ্রণ

যদি আমরা তাদের একসাথে শৃঙ্খলা না করতে পারি তবে এই অশুচি ফাংশনগুলি অকেজো। বিবেচনা

getLine     :: IO String            ~            RealWorld -> (String, RealWorld)
getContents :: String -> IO String  ~  String -> RealWorld -> (String, RealWorld)
putStrLn    :: String -> IO ()      ~  String -> RealWorld -> ((),     RealWorld)

আমরা চাই

  • পেতে কনসোল থেকে একটি ফাইল,
  • পড়া যে ফাইল, এবং
  • কনসোলে ফাইলটির বিষয়বস্তু মুদ্রণ করুন।

আমরা যদি সত্যিকারের বিশ্বের রাষ্ট্রগুলিতে অ্যাক্সেস করতে পারি তবে কীভাবে করব?

printFile :: RealWorld -> ((), RealWorld)
printFile world0 = let (filename, world1) = getLine world0
                       (contents, world2) = (getContents filename) world1 
                   in  (putStrLn contents) world2 -- results in ((), world3)

আমরা এখানে একটি প্যাটার্ন দেখতে পাই। ফাংশনগুলিকে এভাবে বলা হয়:

...
(<result-of-f>, worldY) = f               worldX
(<result-of-g>, worldZ) = g <result-of-f> worldY
...

সুতরাং আমরা কোনও অপারেটরকে ~~~তাদের আবদ্ধ করতে সংজ্ঞায়িত করতে পারি :

(~~~) :: (IO b) -> (b -> IO c) -> IO c

(~~~) ::      (RealWorld -> (b,   RealWorld))
      ->                    (b -> RealWorld -> (c, RealWorld))
      ->      (RealWorld                    -> (c, RealWorld))
(f ~~~ g) worldX = let (resF, worldY) = f worldX
                   in g resF worldY

তাহলে আমরা সহজভাবে লিখতে পারতাম

printFile = getLine ~~~ getContents ~~~ putStrLn

বাস্তব বিশ্বের স্পর্শ ছাড়া।

"Impurification"

এখন ধরা যাক আমরা ফাইলের সামগ্রীটিও বড় হাতের অক্ষরে তৈরি করতে চাই। বড় হাতছাড়া করা একটি খাঁটি ফাংশন

upperCase :: String -> String

তবে এটিকে বাস্তব বিশ্বে পরিণত করতে, এটির একটি ফিরে আসতে হবে IO String। এই জাতীয় ফাংশন উত্তোলন করা সহজ:

impureUpperCase :: String -> RealWorld -> (String, RealWorld)
impureUpperCase str world = (upperCase str, world)

এটি সাধারণীকরণ করা যায়:

impurify :: a -> IO a

impurify :: a -> RealWorld -> (a, RealWorld)
impurify a world = (a, world)

যাতে impureUpperCase = impurify . upperCase, এবং আমরা লিখতে পারি

printUpperCaseFile = 
    getLine ~~~ getContents ~~~ (impurify . upperCase) ~~~ putStrLn

(দ্রষ্টব্য: সাধারণত আমরা লিখি getLine ~~~ getContents ~~~ (putStrLn . upperCase))

আমরা সব সাথে monads সঙ্গে কাজ করছিলাম

এখন দেখা যাক আমরা কী করেছি:

  1. আমরা এমন একটি অপারেটর সংজ্ঞায়িত করেছি (~~~) :: IO b -> (b -> IO c) -> IO cযা দুটি অপরিষ্কার ক্রিয়াকলাপ এক সাথে জড়িত
  2. আমরা একটি ফাংশন সংজ্ঞায়িত করেছি impurify :: a -> IO aযা একটি খাঁটি মানকে অপবিত্রে রূপান্তর করে।

এখন আমরা সনাক্তকরণ (>>=) = (~~~)এবং return = impurify, এবং দেখুন? আমরা একটি monad পেয়েছি।


প্রযুক্তিগত নোট

এটি সত্যই একটি monad তা নিশ্চিত করার জন্য, এখনও কয়েকটি অক্ষ আছে যা খুব পরীক্ষা করা দরকার:

  1. return a >>= f = f a

     impurify a                =  (\world -> (a, world))
    (impurify a ~~~ f) worldX  =  let (resF, worldY) = (\world -> (a, world )) worldX 
                                  in f resF worldY
                               =  let (resF, worldY) =            (a, worldX)       
                                  in f resF worldY
                               =  f a worldX
  2. f >>= return = f

    (f ~~~ impurify) worldX  =  let (resF, worldY) = f worldX 
                                in impurify resF worldY
                             =  let (resF, worldY) = f worldX      
                                in (resF, worldY)
                             =  f worldX
  3. f >>= (\x -> g x >>= h) = (f >>= g) >>= h

    ব্যায়াম হিসাবে বাম।


5
+1 তবে আমি লক্ষ করতে চাই যে এটিতে আইও কেসটি বিশেষভাবে অন্তর্ভুক্ত। blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html বেশ অনুরূপ, তবে সাধারণীকরণ RealWorld... ভাল, আপনি দেখতে পাবেন।
উপদেষ্টা

4
মনে রাখবেন যে এই ব্যাখ্যাটি হাস্কেলের ক্ষেত্রে সত্যই প্রযোজ্য নয় IO, কারণ পরেরটি ইন্টারঅ্যাকশন, একচেটিয়া এবং অবিচ্ছিন্নতাবাদকে সমর্থন করে। আরও কিছু পয়েন্টারের জন্য এই প্রশ্নের আমার উত্তরটি দেখুন।
কনল

2
@ কনোনাল জিএইচসি আসলে IOএইভাবে বাস্তবায়ন করে , কিন্তু RealWorldবাস্তবে সত্যিকারের বিশ্বের প্রতিনিধিত্ব করে না, এটি ক্রিয়াকলাপগুলি সুসংগত রাখার জন্য একটি চিহ্ন মাত্র ("যাদু" RealWorldহ'ল জিএইচসি হাস্কেলের একমাত্র স্বতন্ত্রতা)
জেরেমি তালিকা

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

1
@ ক্লোনাল আমার মন্তব্যটি আমাকে জিএইচসি উত্স কোডের সংশ্লিষ্ট অংশগুলি পড়ার কারণে হয়েছিল।
জেরেমি তালিকা

43

যে কেউ হাস্কেলের অপরিষ্কার গণনা কেন মনড হিসাবে মডেল করা হয় কিছু পয়েন্টার দিতে পারে?

এই প্রশ্নে একটি বিস্তৃত ভুল বোঝাবুঝি রয়েছে। অপরিষ্কার এবং মোনাড স্বতন্ত্র ধারণা ions অপরিষ্কারতা মোনাড মডেল করেন না । বরং, কয়েকটি ডেটা ধরণের রয়েছে, যেমন IO, যা আবশ্যক গণনা উপস্থাপন করে। এবং এই ধরণের কিছুগুলির জন্য, তাদের ইন্টারফেসের একটি ক্ষুদ্র ভগ্নাংশ "মোনাড" নামক ইন্টারফেস প্যাটার্নের সাথে মিলে যায়। তদুপরি, এর কোন সুনির্দিষ্ট / কার্যকরী / বর্ণবাদী ব্যাখ্যা নেই IO(এবং "পাপবিন" এর উদ্দেশ্য বিবেচনা করে এর একটি হওয়ার সম্ভাবনা নেই IO), যদিও World -> (a, World)এর অর্থ হওয়ার বিষয়ে সাধারণভাবে বলা গল্প আছে IO a। সেই গল্পটি সত্যই বর্ণনা করতে পারে না IO, কারণIOসম্মতি এবং অদ্বিতীয়তাবাদ সমর্থন করে। গল্পটি এমনকি কার্যকর হয় না যখন নির্জনবাদী গণনার জন্য যা বিশ্বের সাথে মধ্য-গণনার মিথস্ক্রিয়াকে মঞ্জুরি দেয়।

আরও ব্যাখ্যার জন্য, এই উত্তরটি দেখুন

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


1
@ কেনিটিএম: তবে RealWorldডকস যেমন বলেছেন, "গভীরভাবে যাদু"। এটি একটি টোকেন যা রানটাইম সিস্টেমটি কী করছে তা উপস্থাপন করে, এটি আসল বিশ্ব সম্পর্কে আসলে কিছু বোঝায় না। আপনি অতিরিক্ত কৌশল না করে একটি "থ্রেড" বানাতে কোনও নতুনকে আপত্তিও করতে পারবেন না; নিষ্পাপ দৃষ্টিভঙ্গি কেবল কখনই চলবে তা নিয়ে প্রচুর অস্পষ্টতার সাথে একটি একক, অবরুদ্ধ কর্ম তৈরি করবে।
সিএ ম্যাকক্যান

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

3
" Monadসাধারণ" দ্বারা আমি মোটামুটি অর্থ forall m. Monad m => ..., অর্থাত্ একটি স্বেচ্ছাসেবী উদাহরণে কাজ করা। আপনি যথেচ্ছ মোনাড দিয়ে যে কাজগুলি করতে পারেন তা হ'ল IO: আপনি যেমনটি করতে পারেন ঠিক তেমন: অস্বচ্ছ আদিম গ্রহণ (ক্রমানুসারে আর্গুমেন্ট হিসাবে, বা লাইব্রেরি থেকে যথাক্রমে), কোনও অপস নির্মাণ returnবা অপরিবর্তনীয় পদ্ধতিতে একটি মান রূপান্তর (>>=)। একটি স্বেচ্ছাসেবী মোনাডে প্রোগ্রামিংয়ের সারাংশ অপরিবর্তনীয় ক্রিয়াগুলির তালিকা তৈরি করে: "এক্স করুন, তারপরে Y করুন, তারপরে ..."। আমার কাছে বেশ জরুরী মনে হচ্ছে!
সিএ ম্যাকক্যান

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

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

13

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


3
বেশ না। এটি জানা গেছে যে একটি মোনাড খুব দীর্ঘ সময়ের জন্য ব্যাখ্যার মডেল করতে পারে (কমপক্ষে "টপোই: লজিকের একটি শ্রেণিবদ্ধ বিশ্লেষণ) থেকে। অন্যদিকে, দৃads়ভাবে টাইপ করা কার্যকরী না হওয়া পর্যন্ত স্পষ্টতই মনদাদের প্রকারগুলি প্রকাশ করা সম্ভব ছিল না। ভাষাগুলি প্রায় কাছাকাছি এসেছিল এবং তারপরে মোগি দু'একজনকে একসাথে রেখেছিলেন
নাম

1
ম্যান্ডস যদি মানচিত্রের মোড়কের পরিপ্রেক্ষিতে সংজ্ঞায়িত করা হয় এবং মোড়কের প্রতিশব্দ হিসাবে প্রত্যাবর্তনের সাথে আন-র্যাপ করা হয় তবে এটি বোঝা সহজ হতে পারে।
aoeu256

9

যে কেউ হাস্কেলের অপরিষ্কার গণনা কেন মনড হিসাবে মডেল করা হয় কিছু পয়েন্টার দিতে পারে?

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

এর অর্থ আপনাকে এমন কোনও প্রকারের সাথে শেষ করতে হবে যা IO aএকটি অনিশ্চিত গণনার মডেল করে। তারপরে আপনাকে এই গণনাগুলির সংমিশ্রনের উপায়গুলি জানতে হবে যাগুলির ক্রম ( >>=) অনুসারে প্রয়োগ হয় এবং একটি মান ( return) সর্বাধিক সুস্পষ্ট এবং মৌলিক হয় lift

এই দুটি দিয়ে আপনি ইতিমধ্যে একটি মোনাডকে সংজ্ঞায়িত করেছেন (এটি এমনকি চিন্তা না করে);)

উপরন্তু, monads প্রদান খুব সাধারণ এবং শক্তিশালী বিমূর্ত , নিয়ন্ত্রণ প্রবাহ অনেক ধরণের সুবিধামত মত পরমাণুসদৃশ্য ফাংশন মধ্যে সাধারণ যাবে sequence, liftMবা বিশেষ সিনট্যাক্স, unpureness যেমন একটি বিশেষ ক্ষেত্রে হয়।

আরও তথ্যের জন্য কার্যকরী প্রোগ্রামিং এবং স্বতন্ত্রতা টাইপিংয়ে একমাত্র বিকল্পগুলি (আমি জানি কেবলমাত্র বিকল্প) দেখুন ads


6

আপনি যেমনটি বলেন, Monadএকটি খুব সাধারণ কাঠামো। উত্তরের একটি অর্ধেক হ'ল: Monadসহজতম কাঠামো যা আমরা সম্ভবত পার্শ্ব-প্রভাবকারী ফাংশনগুলিকে দিতে পারি এবং সেগুলি ব্যবহার করতে সক্ষম হতে পারি। সঙ্গে Monadআমরা দুটি জিনিস করতে পারেন: আমরা একটি পার্শ্ব-effecting মান (যেমন একটি বিশুদ্ধ মান বিবেচনা করতে পারেন return), এবং আমরা একটি নতুন পার্শ্ব-effecting মান পেতে একটি পার্শ্ব-effecting মান একটি পার্শ্ব-effecting ফাংশন প্রয়োগ করতে পারেন ( >>=)। এর মধ্যে যে কোনও একটি করে করার ক্ষমতা হারাতে পঙ্গু হয়ে উঠবে, তাই আমাদের পার্শ্ব-প্রতিক্রিয়াশীল ধরণেরটি "কমপক্ষে" হওয়া দরকার Monadএবং এটি Monadএখনও পর্যন্ত আমাদের প্রয়োজনীয় সমস্ত কিছু বাস্তবায়নের জন্য যথেষ্ট।

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

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

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


4

কার্যত পদ্ধতিতে I / O সম্পর্কে ভাবার পক্ষে এটি বেশ পরিষ্কার উপায়।

বেশিরভাগ প্রোগ্রামিং ভাষায়, আপনি ইনপুট / আউটপুট ক্রিয়াকলাপ করেন। মধ্যে Haskell, এর লেখা কোড কল্পনা করতে না অপারেশন, কিন্তু অপারেশনের একটি তালিকা আপনি করতে চান তৈরি করতে।

মনডস ঠিক ঠিক এটির জন্য বেশ সুন্দর বাক্য গঠন।

যদি আপনি জানতে চান কেন মনাদগুলি অন্য কোনও কিছুর বিরোধিতা করে, আমার ধারণা উত্তরটি হ'ল তারা হ'ল হাস্কেল তৈরি করার সময় লোকেরা ভাবতে পারে যে I / O উপস্থাপনের জন্য এটি সর্বোত্তম কার্যকরী উপায়।


3

আফাইক, কারণটি টাইপ সিস্টেমে পার্শ্ব প্রতিক্রিয়া চেক অন্তর্ভুক্ত করতে সক্ষম হবেন। আপনি যদি আরও জানতে চান তবে সেই এসই-রেডিও পর্বগুলি শুনুন : পর্ব 108: ফাংশনাল প্রোগ্রামিং এবং হাস্কেল পর্ব 72 এ সাইমন পাইটন জোন্স: লিনকিউতে এরিক মেইজার


2

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

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

সুতরাং আমরা চাই আমাদের ভাষা (হাস্কেল) শুদ্ধ হোক be তবে আমাদের ইনপুট / আউটপুট ক্রিয়াকলাপগুলির প্রয়োজন যেমন সেগুলি ছাড়া আমাদের প্রোগ্রাম কার্যকর হতে পারে না। এবং এই অপারেশনগুলি তাদের প্রকৃতির দ্বারা খাঁটি হতে পারে না। সুতরাং এটি মোকাবেলার একমাত্র উপায় আমাদের অপরিশোধিত ক্রিয়াকলাপগুলি বাকী কোড থেকে আলাদা করতে হবে।

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

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

দ্রষ্টব্য, যে বিকাশযুক্ত কনস্ট্রাক্টটির অপরিষ্কারতার সাথে মিল নেই। এর কেবলমাত্র বৈশিষ্ট্য রয়েছে, যা আমরা কামনা করি অপরিষ্কার ক্রিয়াকলাপগুলির সাথে মোকাবিলা করতে সক্ষম হয়েছি, যথা - কোনরকম পালাতে হবে না, শৃঙ্খলিত হওয়া এবং প্রবেশের উপায়।

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

পরিশেষে, আমি বলতে চাই, সেই মোনাড অপরিষ্কার ক্রিয়াকলাপগুলিকে খাঁটি রূপান্তর করে না। এটি কেবল তাদের কার্যকরভাবে আলাদা করতে দেয়। (আমি পুনরাবৃত্তি করি যে এটি কেবল আমার বোঝার জন্য)


1
এগুলি আপনাকে চেক এফেক্টগুলি টাইপ করে আপনার প্রোগ্রামটি পরীক্ষা করতে সহায়তা করে এবং আপনার ফাংশনগুলি যাতে করতে পারে তার প্রভাবগুলি সীমাবদ্ধ করার জন্য আপনার নিজের ডিএসএলগুলি সংক্ষিপ্ত আকার তৈরি করে সংজ্ঞায়িত করতে পারেন যাতে আপনার ক্রমসংক্রমক ত্রুটিগুলি পরীক্ষা করতে পারে।
aoeu256

এওউ 256 এর এই মন্তব্যটি "কেন" যা এখনও অবধি দেওয়া সমস্ত ব্যাখ্যায় অনুপস্থিত। (যেমন: মনাদগুলি মানুষের জন্য নয়, তবে সংকলকগুলির জন্য)
জোওও ওটারো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.