আমি ভাবছি যে ব্যবহারযোগ্যতা / রক্ষণাবেক্ষণের জন্য আরও ভাল ডিজাইন বুদ্ধিমান কি না এবং সম্প্রদায়ের সাথে উপযুক্ত হিসাবে আরও ভাল।
ডেটা মডেল দেওয়া:
type Name = String
data Amount = Out | Some | Enough | Plenty deriving (Show, Eq)
data Container = Container Name deriving (Show, Eq)
data Category = Category Name deriving (Show, Eq)
data Store = Store Name [Category] deriving (Show, Eq)
data Item = Item Name Container Category Amount Store deriving Show
instance Eq (Item) where
(==) i1 i2 = (getItemName i1) == (getItemName i2)
data User = User Name [Container] [Category] [Store] [Item] deriving Show
instance Eq (User) where
(==) u1 u2 = (getName u1) == (getName u2)
আমি আইটেম বা স্টোর ইত্যাদি যুক্ত করে উদাহরণস্বরূপ ব্যবহারকারীর রূপান্তর করতে monadic ফাংশনগুলি বাস্তবায়িত করতে পারি, তবে আমি একটি অবৈধ ব্যবহারকারীর সাথে শেষ করতে পারি যাতে এই monadic ফাংশনগুলি তাদের প্রাপ্ত ব্যবহারকারীকে এবং বৈধ করে তোলার প্রয়োজন হয় create
সুতরাং, আমি কি ঠিক:
- এটিকে একটি ত্রুটি মোনাডে মোড়ানো করুন এবং মোনাদিক ফাংশনগুলি বৈধকরণ কার্যকর করুন
- এটিকে একটি ত্রুটি মোনাডে আবদ্ধ করুন এবং ভোক্তাকে যথাযথ ত্রুটির প্রতিক্রিয়া ছুঁড়ে এমন ক্রমে একটি এককীয় বৈধতা ফাংশন বাঁধুন (যাতে তারা কোনও অবৈধ ব্যবহারকারীর অবধি বৈধতা না দিয়ে এবং বহন করতে পারে)
- ব্যবহারকারী এটি কার্যকরভাবে আমার নিজস্ব ত্রুটি মোনাড তৈরি করে যা প্রতিটি বাইন্ডের সাথে বৈধতা স্বয়ংক্রিয়ভাবে কার্যকর করে কার্যকরভাবে এটি একটি বাঁধাই দৃষ্টান্ত হিসাবে তৈরি করে
আমি 3 টি পদ্ধতির প্রতিটির ইতিবাচক এবং নেতিবাচক দেখতে পাচ্ছি তবে সম্প্রদায়ের দ্বারা এই দৃশ্যের জন্য আরও কী করা হয় তা জানতে চাই।
কোড শর্তাবলী মত কিছু, বিকল্প 1:
addStore s (User n1 c1 c2 s1 i1) = validate $ User n1 c1 c2 (s:s1) i1
updateUsersTable $ someUser >>= addStore $ Store "yay" ["category that doesnt exist, invalid argh"]
বিকল্প 2:
addStore s (User n1 c1 c2 s1 i1) = Right $ User n1 c1 c2 (s:s1) i1
updateUsersTable $ Right someUser >>= addStore $ Store "yay" ["category that doesnt exist, invalid argh"] >>= validate
-- in this choice, the validation could be pushed off to last possible moment (like inside updateUsersTable before db gets updated)
বিকল্প 3:
data ValidUser u = ValidUser u | InvalidUser u
instance Monad ValidUser where
(>>=) (ValidUser u) f = case return u of (ValidUser x) -> return f x; (InvalidUser y) -> return y
(>>=) (InvalidUser u) f = InvalidUser u
return u = validate u
addStore (Store s, User u, ValidUser vu) => s -> u -> vu
addStore s (User n1 c1 c2 s1 i1) = return $ User n1 c1 c2 (s:s1) i1
updateUsersTable $ someValidUser >>= addStore $ Store "yay" ["category that doesnt exist, invalid argh"]