Я не могу спать! :)Lazy vs нетерпеливая оценка и построение двойного списка
Я написал небольшую программу, создав двойной связанный список в Haskell. Свойство основного языка, чтобы сделать это, было ленивой оценкой (см. Кучу кода ниже). И мой вопрос: могу ли я сделать то же самое в чистом функциональном языке с eager Оценка или нет? В любом случае, какие свойства eager функциональный язык должен иметь возможность построить такую структуру (примесь?)?
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). :) Он возвращает только головной узел и исключительно прост. –