【问题标题】:Using foldl, write a function that converts a list of integers to an integer number?使用 foldl,编写一个将整数列表转换为整数的函数?
【发布时间】:2021-09-03 20:16:11
【问题描述】:

我正在尝试编写一个函数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

如何在递归过程中引用列表?我希望 length xs 的值在每次递归调用 foldl 时都发生变化?

【问题讨论】:

  • dec2int' = foldl (\x y -> 10*x +y) 0 看起来是唯一简单的解决方案。通过使用权力,我们需要使用索引,这会降低函数的可读性。

标签: list haskell recursion foldleft


【解决方案1】:

您可以在折叠的step函数中跟踪索引:

dec2int xs = snd $ foldl (\(i, a) b -> (i + 1, a + b * 10 ^ (l - i))) (1, 0) xs
  where l = length xs

但是,正如 Willem van Onsem 所说,这比它需要的要复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 2016-02-04
    • 1970-01-01
    • 2019-02-08
    • 2020-01-23
    • 2017-04-25
    • 2022-11-10
    • 2023-03-13
    相关资源
    最近更新 更多