देखते हैं जब हम GHC's Set code अनुकूलन अनंत सेट समायोजित करने के लिए क्या होता है:
module InfSet where
data InfSet a = Bin a (InfSet a) (InfSet a)
-- create an infinite set by unfolding a value
ofUnfold :: (x -> (x, a, x)) -> x -> InfSet a
ofUnfold f x =
let (lx,a,rx) = f x
l = ofUnfold f lx
r = ofUnfold f rx
in Bin a l r
-- check for membership in the infinite set
member :: Ord a => a -> InfSet a -> Bool
member x (Bin y l r) = case compare x y of
LT -> member x l
GT -> member x r
EQ -> True
-- construct an infinite set representing a range of numbers
range :: Fractional a => (a, a) -> InfSet a
range = ofUnfold $ \(lo,hi) ->
let mid = (hi+lo)/2
in ((lo, mid), mid, (mid, hi))
नोट कैसे, बजाय एक अनंत सूची से अनंत सेट के निर्माण की, मैं बजाय एक समारोह ofUnfold
एकल मान प्रकट करना परिभाषित एक अनंत सूची में। यह हमें समानांतर में दोनों शाखाओं को आलसी बनाने की अनुमति देता है (हमें किसी अन्य निर्माण से पहले एक शाखा को समाप्त करने की आवश्यकता नहीं है)।
की यह एक बार आज़माएंगे करते हैं:
ghci> :l InfSet
[1 of 1] Compiling InfSet (InfSet.hs, interpreted)
Ok, modules loaded: InfSet.
ghci> let r = range (0,128)
ghci> member 64 r
True
ghci> member 63 r
True
ghci> member 62 r
True
ghci> member (1/2) r
True
ghci> member (3/4) r
True
ठीक है, वह काम करने लगता है। क्या होगा यदि हम सेट के बाहर एक मूल्य का प्रयास करें?
ghci> member 129 r
^CInterrupted.
यह सिर्फ दौड़ने और चलाने और कभी नहीं छोड़ेगा। असीमित सेट, में कोई रोक शाखा नहीं है, इसलिए खोज कभी नहीं निकलती है। हम किसी भी तरह मूल सीमा की जांच कर सकता है, लेकिन यह है कि असतत तत्वों की अनंत सेट के लिए व्यावहारिक नहीं है:
ghci> let ex = ofUnfold (\f -> (f . (LT:), f [EQ], f . (GT:))) id
ghci> :t ex
ex :: InfSet [Ordering]
ghci> member [EQ] ex
True
ghci> member [LT,EQ] ex
True
ghci> member [EQ,LT] ex
^CInterrupted.
तो अनंत सेट संभव रहे हैं, लेकिन मुझे यकीन है कि वे उपयोगी रहे नहीं हूँ।
आप [Set.fromList] के स्रोत [http://hackage.haskell.org/packages/archive/containers/latest/doc/html/src/Data-Set.html#fromList) में देख सकते हैं। इसे 'foldlStrict' के साथ कार्यान्वित किया गया है। (यह 'फ़ोल्ड' का उपयोग क्यों नहीं करता है, मैं निश्चित नहीं हूं लेकिन यह स्पष्ट रूप से वही है।) –