( এই প্রশ্নের আমার উত্তর দ্বারা অনুপ্রাণিত ।)
এই কোডটি বিবেচনা করুন (প্রদত্ত ইনপুটের চেয়ে কম বা সমান যে বৃহত্তম উপাদান এটি সন্ধান করা উচিত):
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। আমি কীভাবে এটি লিখতে পারি যাতে এটি অলস কিন্তু নিজের কাছে পুনরাবৃত্তি না করে?