2017-07-10 74 views
2

。 [0,1,0,1] = 10可以使用:將比特轉換爲int,並且右邊爲左邊,例如

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

不能使用'xs'作爲「(+)」的論點;它是一個列表,而不是該列表中的值的總和。 – chepner

+2

@chepner我認爲這是相反的:在第二個定義中,'xs'是一個數字,所以它不能被送入'length'。 – chi

+0

Right;我永遠不能將這個功能的論據保持一致。 – chepner

回答

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