( এই প্রশ্নের আমার উত্তর দ্বারা অনুপ্রাণিত ।)
এই কোডটি বিবেচনা করুন (প্রদত্ত ইনপুটের চেয়ে কম বা সমান যে বৃহত্তম উপাদান এটি সন্ধান করা উচিত):
data TreeMap v = Leaf | Node Integer v (TreeMap v) (TreeMap v) deriving (Show, Read, Eq, Ord)
closestLess :: Integer -> TreeMap v -> Maybe (Integer, v)
closestLess i = precise Nothing where
precise :: Maybe (Integer, v) -> TreeMap v -> Maybe (Integer, v)
precise closestSoFar Leaf = closestSoFar
precise closestSoFar (Node k v l r) = case i `compare` k of
LT -> precise closestSoFar l
EQ -> Just (k, v)
GT -> precise (Just (k, v)) r
এটি খুব অলস নয়। একবার GT
কেস প্রবেশ করা গেলে , আমরা নিশ্চিতভাবে জানি যে চূড়ান্ত রিটার্ন মান Just
পরিবর্তে কিছু হবে Nothing
, তবে Just
এখনও শেষ পর্যন্ত পাওয়া যায় না। আমি এই অলসটি তৈরি করতে চাই যাতে কেস প্রবেশের Just
সাথে সাথেই এটি উপলব্ধ হয় GT
। এর জন্য আমার পরীক্ষার কেসটি হ'ল আমি বোতলের চেয়ে Data.Maybe.isJust $ closestLess 5 (Node 3 () Leaf undefined)
মূল্যায়ন করতে চাই True
। এটি করার জন্য আমি ভাবতে পারি এমন এক উপায়:
data TreeMap v = Leaf | Node Integer v (TreeMap v) (TreeMap v) deriving (Show, Read, Eq, Ord)
closestLess :: Integer -> TreeMap v -> Maybe (Integer, v)
closestLess _ Leaf = Nothing
closestLess i (Node k v l r) = case i `compare` k of
LT -> closestLess i l
EQ -> Just (k, v)
GT -> Just (precise (k, v) r)
where
precise :: (Integer, v) -> TreeMap v -> (Integer, v)
precise closestSoFar Leaf = closestSoFar
precise closestSoFar (Node k v l r) = case i `compare` k of
LT -> precise closestSoFar l
EQ -> (k, v)
GT -> precise (k, v) r
যাইহোক, আমি এখন নিজেকে পুনরাবৃত্তি করছি: মূল যুক্তিটি এখন এবং উভয়ই closestLess
মধ্যে precise
। আমি কীভাবে এটি লিখতে পারি যাতে এটি অলস কিন্তু নিজের কাছে পুনরাবৃত্তি না করে?