foldl :: (b -> a -> b) -> b -> [a] -> b
迭代地将以b
开头的函数应用到列表a
s,直到列表耗尽并返回结果。在这种情况下,我们的a
s可以是移位长度。所以1
,2
,4
。我们可以用iterate :: (a -> a) -> a -> [a]
构建这样一个列表。确实:
powers2 = iterate (2*) 1
现在我们可以将该列表提供给foldl
。功能foldl
执行的是\qi s -> xor qi (shiftL qi s)
。因此,完整的职能将是:
qn :: (Num a, Foldable t, Bits [a]) => Int -> r -> t Int -> [a]
qn n q = foldl (\qi s -> xor qi (shiftL qi s)) q $ take n $ iterate (2*) 1
所以如果我们调用qn 3 q
我们对q
执行功能的三倍,从而获得您的示例q2
。例如:
Prelude Data.Bits> qn 3 15
1285
由于:
q = 0000 0000 1111
shiftL q 1 = 0000 0001 1110
--------------
q0 = 0000 0001 0001
shiftL q0 2 = 0000 0100 0100
--------------
q1 = 0000 0101 0101
shiftL q1 4 = 0101 0101 0000
--------------
q2 = 0101 0000 0101
这是1285
你在找什么结果?只有'q2',或者所有'qi's? –
我只需要q2。 – sacheie
我不确定我是否明白您发布的代码存在什么问题。你是否尝试使用'1','2','4'作为移位量?因为你写的东西可以翻译成简单的左边折叠,不是吗? ''sbox q = foldl'(\ q'i - > q''xor' shiftL q'i)q [1,2,4]'' –