从右到左的位数组,例如[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的结果)
答案 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