【发布时间】:2020-10-02 18:47:33
【问题描述】:
当尝试使用 foldr 实现 dropWhile 时,我想出的第一个算法是这样的
dropWhile' :: (a -> Bool) -> [a] -> [a]
dropWhile' pred = fst . foldr (\cur (acc, xs) ->
if pred cur
then (acc, cur:xs)
else (cur:xs, cur:xs)) ([], [])
虽然这可行,但它会导致无限列表上的堆栈溢出而不给出任何值。 因为我不确定,为什么这不起作用,所以我只是玩弄了这个函数,直到我想出了这个:
dropWhile' :: (a -> Bool) -> [a] -> [a]
dropWhile' pred = fst . foldr (\cur t -> let (acc, xs) = t in
if pred cur
then (acc, cur:xs)
else (cur:xs, cur:xs)) ([], [])
如您所见,这个和第一个之间的唯一区别是,这里我在 let 绑定中解构元组 (acc, xs),而不是直接在函数参数中解构。由于某些奇怪的原因,此代码适用于无限列表。
如果有人知道为什么会这样,请告诉我。
【问题讨论】:
标签: list haskell tuples lazy-evaluation destructuring