haskell – 使用foldr实现take

这是我使用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]

输出不是我所期望的:

[3,4]

然后我尝试通过将y的长度插入到自身来进行调试,结果是:

[3,2,1,0]

我不明白为什么长度按降序插入.也许我错过了一些明显的事

如果要使用foldr实现take,则需要模拟从左到右遍历列表.重点是使折叠函数依赖于一个额外的参数,该参数对您想要的逻辑进行编码,而不仅仅依赖于列表的折叠尾部.

take :: Int -> [a] -> [a]
take n xs = foldr step (const []) xs n
  where
    step x g 0 = []
    step x g n = x:g (n-1)

这里,foldr返回一个函数,该函数接受一个数字参数并从左到右遍历列表,从中获取所需的数量.由于懒惰,这也适用于无限列表.一旦额外参数达到零,foldr将短路并返回一个空列表.

翻译自:https://stackoverflow.com/questions/15879940/implementing-take-using-foldr

转载注明原文:haskell – 使用foldr实现take