Algorithm Haskell foldWhile或reduceWhile没有列表函数?

Algorithm Haskell foldWhile或reduceWhile没有列表函数?,algorithm,haskell,functional-programming,Algorithm,Haskell,Functional Programming,我正在寻找一个haskell函数或模式,它是一种“折叠时”,除了它使用函数输出而不是折叠列表。一些代码可能会更好地解释它 简化和伪: nums :: [Integer] nums = [1] cond :: v -> [Integer] -> Bool cond v ls = elem v ls func :: x -> ls -> [Integer] func x ls = x `some_op` ls 我需要一种应用模式,如: (cond 1 num) &

我正在寻找一个haskell函数或模式,它是一种“折叠时”,除了它使用函数输出而不是折叠列表。一些代码可能会更好地解释它

简化和伪:

nums :: [Integer]
nums = [1]

cond :: v -> [Integer] -> Bool
cond v ls = elem v ls

func :: x -> ls -> [Integer]
func x ls = x `some_op` ls
我需要一种应用模式,如:

(cond 1 num) && func x num -> num'
(cond 1 num') && func x num' -> num''
(cond 1 num'') && func x num'' -> num'''
...
一旦cond返回False,就产生最后一个num


如果您有任何帮助,我们将不胜感激。

我想您需要结合使用
iterate
takeWhile

iterate :: (a -> a) -> a -> [a]
takeWhile (a -> Bool) -> [a] -> [a]

iterateWhile :: (a -> a) -> (a -> Bool) -> a -> [a]
iterateWhile func cond = takeWhile cond . iterate func
在你的情况下,你会想用它作为

lastWhere :: (a -> a) -> (a -> Bool) -> a -> a
lastWhere func cond = last . iterateWhile func cond

main = do
    let x = lastWhere (+1) (<10) 1
    print x
    -- prints "9"
firstWhere :: (a -> a) -> (a -> Bool) -> a -> a
firstWhere func cond = head . dropWhile cond . iterate func