使用foldr将位转换为int forward

时间:2017-07-10 17:19:20

标签: haskell

从右到左的位数组,例如[0,1,0,1] = 10可以通过以下方式阅读:

binToInt = foldr (\x xs -> x + 2 * xs) 0  

我想从左到右阅读,例如[1,0,1,0] = 10

我认为这样可行:

binToInt' = foldr (\x xs -> (x * ((^) 2 (length xs)) + xs) 0

然而我收到错误:

Couldn't match type `t0 a0' with `Int' 

我做错了什么?

(作为一种解决方法,我正在逆转binToInt的结果)

1 个答案:

答案 0 :(得分:4)

我解决了我的问题:

binToInt' = foldl (\acc x -> x + 2 * acc) 0

展开:

f = (\acc x -> x + 2 * acc)
foldl f 0
  [1,0,1,0]
  (f [1,0,1]) * 2 + 0
  ((f [1,0]) * 2 + 1) * 2 + 0
  (((f [1]) * 2 + 0) * 2 + 1) * 2 + 0
  ((((f []) * 2 + 1) * 2 + 0) * 2 + 1) * 2 + 0
  ((((0) * 2 + 1) * 2 + 0) * 2 + 1) * 2 + 0