【问题标题】:Issue with the length function in Haskell [duplicate]Haskell中的长度函数问题[重复]
【发布时间】:2020-07-11 14:45:21
【问题描述】:

我正在尝试在 Haskell 中编写一个函数,该函数将获取整数列表,例如 [1,2,3,4,5] 并使用递归将它们转换为数字,例如 12345。我正在使用 Haskell 标准库中的长度函数来计算数字的位置,以便它们可以加在一起(10000+2000+300+40+5)。但是,当我使用 length 来计算列表的长度时,无论如何它总是 1,我不知道为什么。这是我的代码:

dig :: [Integer] -> Integer
dig [] = 0
dig (x:xs) = x * (10^(fromIntegral(length[xs]))) + fromDigits(xs)

运行此代码将始终将数字乘以 10,长度始终为 1,因此 dig [1,2,3,4] 给出 100 而不是 1234。

【问题讨论】:

  • 我将此问题链接到一个较旧的问题,该问题解决了这里的主要问题,只是为了交叉引用。

标签: list haskell recursion integer


【解决方案1】:

使用[xs],您将 xs 放入一个新的单元素列表中,因此长度为一。

只需改用length xs

更简单的方法是将每个递归步骤的累积结果乘以 10:

dig :: [Integer] -> Integer
dig = foldl' (\a e -> 10 * a + e) 0

【讨论】:

  • 编译器如何知道数组中有哪些元素a和e?这是无点速记吗?
  • @wide_eyed_pupil 检查foldl' :: (a -> b -> a) -> a -> [b] -> a 的类型,它采用一个函数,将a 类型的累加器和b 类型的数组的值组合起来,并生成一个新的a
猜你喜欢
  • 2014-07-22
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2020-03-24
相关资源
最近更新 更多