मैं सो नहीं सकता! :)आलसी बनाम उत्सुक मूल्यांकन और डबल लिंक्ड सूची निर्माण
मैंने हास्केल में डबल प्रोग्राम बिल्डिंग डबल लिंक्ड लिस्ट लिखी है। इसे बनाने के लिए मूल भाषा की संपत्ति आलसी मूल्यांकन थी (नीचे दिए गए कोड का समूह देखें)। और मेरा सवाल यह है कि मैं शुद्धउत्सुक मूल्यांकन के साथ कार्यात्मक भाषा में ऐसा कर सकता हूं या नहीं? किसी भी मामले में, उत्सुक कार्यात्मक भाषा को ऐसी संरचना (अशुद्धता?) बनाने में सक्षम होना चाहिए?
import Data.List
data DLList a = DLNull |
DLNode { prev :: DLList a
, x :: a
, next :: DLList a
}
deriving (Show)
walkDLList :: (DLList a -> DLList a) -> DLList a -> [a]
walkDLList _ DLNull = []
walkDLList f [email protected](DLNode _ x _) = x : walkDLList f (f n)
-- Returns first and last items.
makeDLList :: [a] -> (DLList a, DLList a)
makeDLList xs = let (first, last) = step DLNull xs in (first, last)
where
step prev [] = (DLNull, prev)
-- Here I use laziness. 'next' is not built yet, it's a thunk.
step prev (x : xs) = let this = DLNode prev x next
(next, last) = step this xs
in (this, last)
testList :: [Int] -> IO()
testList l = let
(first, last) = makeDLList l
byNext = walkDLList next first
byPrev = walkDLList prev last
in do
putStrLn $ "Testing: " ++ show l
print byNext
print byPrev
main = do
testList []
testList [1, 2, 3, 4]
[* यह * कोड] देखें (http://rosettacode.org/wiki/Doubly-Linked_List_%28traversal%29#Haskell)। :) यह सिर्फ सिर नोड देता है, और असाधारण रूप से सरल है। –