我想使用列表理解返回所有小于参数Int的多维数据集(x^3)。我有以下内容:
cubesLessThanN :: Int -> [Int]
cubesLessThanN int = [if x * x * x <= int then x else * | x <- [0..int]]
星号是我遇到问题的地方。我有点想在else
发生后停止处理循环。最终的[list]
应该只有多维数据集,而不是x
的其他值。我真的不在乎它是如何发生的,但我想知道有哪些选择,以及有什么区别(如果有的话)。
如果我尝试返回null
、Nothing
、''
和其他几个。我知道如果我返回任何东西,我应该返回一个类型的int
。
使用takeWhile
:
cubesLessThanN :: Int -> [Int]
cubesLessThanN int = takeWhile ((<= int) . (^3)) [0..]
列出综合支持防护。
[x | x <- [0..int], x ^ 3 <= int]
由于列表理解对于列表monad来说是糖,这相当于在do
块中使用guard
函数:
do
x <- [0..int]
guard (x ^ 3 <= int)
return x
如果我们将其降级到>>=
中,并内联>>=
和guard
的定义:
concatMap (x -> if x ^ 3 <= int then [x] else []) [0..int]
这类似于过滤器。
filter (x -> x ^ 3 <= int) [0..int]
即使在x ^ 3
的值超过int
的值之后,检查条件也将继续(延迟)。为了防止这种情况,您可以使用takeWhile
,因为您知道您的函数是单调的。
takeWhile (x -> x ^ 3 <= int) [0..int]
取一个立方体根
[ x ^ 3 | x <- [ 1 .. ceiling (fromIntegral int ** (1/3)) ], x ^ 3 < int ]
例如:
λ let int = 1000 in [ x ^ 3 | x <- [ 1 .. ceiling (fromIntegral int ** (1/3)) ], x ^ 3 < int ] :: [Int]
[1,8,27,64,125,216,343,512,729]