位数组从右到左,例如 [0,1,0,1] = 10 可以通过以下方式读取:
binToInt = foldr (\x xs -> x + 2 * xs) 0
Run Code Online (Sandbox Code Playgroud)
我想从左到右阅读,例如 [1,0,1,0] = 10
我认为这会起作用:
binToInt' = foldr (\x xs -> (x * ((^) 2 (length xs)) + xs) 0
Run Code Online (Sandbox Code Playgroud)
但是我收到错误:
Couldn't match type `t0 a0' with `Int'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
(作为解决方法,我正在反转 binToInt 的结果)
我解决了我的问题:
binToInt' = foldl (\acc x -> x + 2 * acc) 0
Run Code Online (Sandbox Code Playgroud)
展开为:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |