2017-07-10 5 views
2

ビット配列を右から左へ[0,1,0,1] = 10は、foldrを使用してfoldrをforwardに変換します。

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

'(+)'への引数。それはリストであり、そのリスト内の値の合計ではありません。 – chepner

+2

@chepner私はそれが逆だと思います.2番目の定義では、 'xs'は数値なので、' length'に与えられません – chi

+0

右;私は決してその関数への議論をまっすぐに保つことはできません。 – chepner

答えて

4

私は私の問題を解決しました:

に繰り広げられる
binToInt' = foldl (\acc x -> x + 2 * acc) 0 

あなたのように `xs`を使用することはできません
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 
関連する問題