我想使用iterate
函数迭代一个名为g
的函数。但是当我运行代码时,循环会无限运行。是否有可能在满足条件时退出循环?
例如:if g x > 100 then stop
。
我的代码:
f x = iterate g x
g x = 2 * x
只需反转条件,并使用takeWhile
,只要条件成立就执行:
f x = takeWhile (<= 100) $ iterate g x
这也可以变成无参函数的形式:
f = takeWhile (<= 100) . iterate g
当累加器小于或等于100时,这将从iterate
返回的无限列表中获取。
是的,你可以使用takeWhile (not . p)
来实现这个功能,相当于
foldr (\x r -> if (not (p x)) then (x:r) else []) []
takeUntil p = foldr (\x r -> if (not (p x)) then (x:r) else [x]) []
takeWhile (not . (> 100)) . iterate (*2)
或takeUntil (> 100) . iterate (*2)
。其中(not . (> 100))
当然和(<= 100)
是一样的。
take 100 $ f 1
- fp_mora