[Haskell-beginners] defining 'init' in terms of 'foldr'
Hein Hundal
hundalhh at yahoo.com
Sun Dec 5 15:51:36 CET 2010
I am trying to understand the differences between two
different solutions to the problem of expressing init in
terms of foldr.
The two solutions are called heinInit and chaddiInit.
The heinInit does not work on infinite lists. The
chaddiaiInit function does work on infinite lists.
heinInit v = fromJust $ foldr f Nothing v
where
f a Nothing = Just []
f a (Just v) = Just (a:v)
chaddaiInit v = fromJust $ foldr f Nothing v
where
f x xs = Just (case xs of Nothing -> []; Just ys -> x:ys)
Here is my guess at the "trace" of the chaddaiInit code.
1)
head (chaddaiInit [1..])
2)
head (fromJust $ foldr f Nothing [1..])
3)
head (fromJust $ f 1 (foldr f Nothing [2..]))
4)
head (fromJust $ Just (case (foldr f Nothing [2..]) of
Nothing -> []; Just ys -> 1:ys))
5)
head (case (foldr f Nothing [2..]) of Nothing -> [];
Just ys -> 1:ys)
6)
head (case (f 2 (foldr f Nothing [3..])) of Nothing -> [];
Just ys -> 1:ys)
7)
head (case (Just (case (foldr f Nothing [3..]) of Nothing -> [];
Just ys -> 2:ys)) of Nothing -> []; Just ys -> 1:ys)
8)
head (1:(case (foldr f Nothing [3..]) of Nothing -> [];
Just ys -> 2:ys))
9)
1
Here is my guess at the "trace" of the heinInit code.
myinit v = fromJust $ foldr f Nothing v
where
f a Nothing = Just []
f a (Just v) = Just (a:v)
1)
head (heinInit [1..])
2)
head (fromJust $ foldr f Nothing [1..])
3)
head (fromJust $ f 1 (foldr f Nothing [2..])
4)
head (fromJust $ f 1 (f 2 (fold f Nothing [3..])
5)
head (fromJust $ f 1 (f 2 (f 3 (fold f Nothing [4..])
And it just keeps going. Is this the right idea? Are my
"traces" a reasonable estimate of how Haskell
evaluates those expressions?
Cheers,
Hein
More information about the Beginners
mailing list