首页 > 解决方案 > Haskell - 在显示 2 次幂的函数中过滤赔率

问题描述

我有这个开发的功能,可以显示您选择的范围内的 2 的幂:

import Data.Bits(Bits, (.&.))
isPower2 :: (Bits i, Integral i) => i -> Bool
isPower2 n = n .&. (n-1) == 0

这很好用,但我只需要从所选范围的赔率数字中过滤 2 的幂,例如:

filter isPower2 [0 .. 1000]
[0,1,2,4,8,16,32,64,128,256,512]

上面的输入和输出显示了 0 到 1000 之间的所有功率,但我需要的只是赔率的功率,所以我需要的输出是:

[2,8,32,128,512]

有没有办法过滤这个函数只指向赔率数字?谢谢。

标签: haskell

解决方案


我建议首先编写一个函数来检查 2 的幂是否是 2 的奇数幂。

power2isOddPower2 :: (Bits i, Integral i) => i -> Bool

也许首先考虑如何针对具体情况执行此操作Word8,然后将其推广到任意正整数。

然后你可以将它与一个谓词结合起来,检查任意数字是否是 2 的奇次幂,并将其用于过滤:

filter (\n -> isPower2 n && power2isOddPower2 n) [0 .. 1000]

推荐阅读