This is my take
version using foldr
:
myTake n list = foldr step [] list
where step x y | (length y) < n = x : y
| otherwise = y
main = do print $ myTake 2 [1,2,3,4]
The output is not what I expect:
[3,4]
I then tried to debug by inserting the length of y
into itself and the result was:
[3,2,1,0]
I don't understand why the lengths are inserted in decreasing order. Perhaps something obvious I missed?
foldr
will apply the functionstep
starting from the last elements." This statement is, at best, very misleading in the face of lazy evaluation. Haskell in fact evaluates your second tree from left to right, and if thestep
function is not-strict on its second argument, it may abort computation early. The simplest example of this issafeHead = foldr (\x _ -> Just x) Nothing
. – Indention