【发布时间】:2021-01-18 16:26:11
【问题描述】:
我想用iterate 迭代函数g。当我运行我的代码时,循环会无限运行。满足条件时有没有可能跳出循环?
类似if g x > 100 then stop。
我的代码:
f x = iterate g x
g x = 2 * x
【问题讨论】:
-
take 100 $ f 1
我想用iterate 迭代函数g。当我运行我的代码时,循环会无限运行。满足条件时有没有可能跳出循环?
类似if g x > 100 then stop。
我的代码:
f x = iterate g x
g x = 2 * x
【问题讨论】:
take 100 $ f 1
只需翻转条件,takeWhile 就成立了:
f x = takeWhile (<= 100) $ iterate g x
这也可以是无意义的:
f = takeWhile (<= 100) . iterate g
这将取自 iterate 在累加器小于或等于 100 时返回的无限列表。
【讨论】:
是的,你可以使用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)是一样的。
【讨论】: