使用 foldl,编写一个将整数列表转换为整数的函数?
Using foldl, write a function that converts a list of integers to an integer number?
我正在尝试编写一个函数 dec2int
将整数列表转换为整数。我唯一的限制是我必须使用 foldl
.
函数的类型签名是:
dec2int :: [Int] -> Int
函数应该这样工作:
Input: dec2int [2,3,4,5]
Output: 2345
我在这里找到了一个我理解的有效解决方案:
dec2int' = foldl (\x y -> 10*x +y) 0
我尝试编写自己的解决方案,根据需要使用 foldl
:
dec2int xs = foldl (\a b -> a + (b*(10^(l-1)))) 0 xs
where l = length xs
但是,我得到这个错误:
ghci> dec2int [1,1]
20
我意识到 length xs
的值必须是常量。但是,我希望该值因我的功能而异。
我想以这种方式工作
0 + 1*10^((length [1,1])-1) = 10 = v
10 + 1 *10^((length [1])-1) = 11
如何在递归过程中引用列表?我希望每次递归调用 foldl
时更改 length xs
的值?
您可以在折叠的步长函数中跟踪索引:
dec2int xs = snd $ foldl (\(i, a) b -> (i + 1, a + b * 10 ^ (l - i))) (1, 0) xs
where l = length xs
但是,正如 Willem van Onsem 所说,这比需要的复杂得多。
我正在尝试编写一个函数 dec2int
将整数列表转换为整数。我唯一的限制是我必须使用 foldl
.
函数的类型签名是:
dec2int :: [Int] -> Int
函数应该这样工作:
Input: dec2int [2,3,4,5]
Output: 2345
我在这里找到了一个我理解的有效解决方案:
dec2int' = foldl (\x y -> 10*x +y) 0
我尝试编写自己的解决方案,根据需要使用 foldl
:
dec2int xs = foldl (\a b -> a + (b*(10^(l-1)))) 0 xs
where l = length xs
但是,我得到这个错误:
ghci> dec2int [1,1]
20
我意识到 length xs
的值必须是常量。但是,我希望该值因我的功能而异。
我想以这种方式工作
0 + 1*10^((length [1,1])-1) = 10 = v
10 + 1 *10^((length [1])-1) = 11
如何在递归过程中引用列表?我希望每次递归调用 foldl
时更改 length xs
的值?
您可以在折叠的步长函数中跟踪索引:
dec2int xs = snd $ foldl (\(i, a) b -> (i + 1, a + b * 10 ^ (l - i))) (1, 0) xs
where l = length xs
但是,正如 Willem van Onsem 所说,这比需要的复杂得多。