如何在Haskell列表理解中中断|break|return



我想使用列表理解返回所有小于参数Int的多维数据集(x^3)。我有以下内容:

cubesLessThanN :: Int -> [Int]  
cubesLessThanN int = [if x * x * x <= int then x else * | x <- [0..int]]

星号是我遇到问题的地方。我有点想在else发生后停止处理循环。最终的[list]应该只有多维数据集,而不是x的其他值。我真的不在乎它是如何发生的,但我想知道有哪些选择,以及有什么区别(如果有的话)。

如果我尝试返回nullNothing''和其他几个。我知道如果我返回任何东西,我应该返回一个类型的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]

最新更新