整数列表到单个整数 - Haskell

List of integers to single integer - Haskell

我似乎在为一些在 Haskell 中应该非常简单的事情而苦苦挣扎,但我就是想不通,我需要一些帮助。我正在尝试转换整数列表 ([3,2,1]) 并将其转换为单个整数 (321)。

这是我目前的情况:

fromDigits :: [Integer] -> Integer
fromDigits [] = 0;
fromDigits (x:xs) = x : fromDigits (xs)

我做错了什么?

您可以使用 worker wrapper 方法来做到这一点:

fromDigits :: [Integer] -> Integer
fromDigits xs = aux xs 0
    where aux [] acc = acc
          aux (x:xs) acc  = aux xs ((acc * 10) + x)

演示:

λ> fromDigits [3,2,1]
321

或者你甚至可以使用高阶函数foldl:

λ> foldl' (\acc x -> (acc * 10) + x) 0 [1,2,3]
123

不是转换。列表 [3,2,1] 可能“看起来”像数字 321,但它不是一对一的关系(正如 Greg 暗示的那样 – [32,1] 看起来像同一个数字),而且肯定不是规范的(为什么要使用基数 10?这实际上是十六进制吗?)因此,应该 在 Haskell[=33= 中真的没有理由特别简单]1。 This is not JavaScript, fortunately.

重复消息...它看起来 像数字 321,仅此而已,它与数字没有任何有意义的关联。所以,如果你真的需要实现这个价值有问题的功能(我认为你不应该),那么你也可以通过黑客攻击来实际利用“看起来像”的东西。即,

fromDigits = read . filter (not . (`elem`"[,]")) . show

这使用列表的 Show 实例,将列表 [3,2,1] 转换 为实际字符串 "[3,2,1]",然后丢弃列出相关字符,并读取连接的字符串 "321" 返回,产生数字 321.


1除了在 Haskell...

中实现纯函数通常非常简单之外