整数列表到单个整数 - Haskell

时间:2015-03-30 00:43:05

标签: list haskell recursion pattern-matching

我似乎正在努力解决Haskell中应该非常简单的事情,但我无法理解它,我需要一些帮助。我试图转换整数列表([3,2,1])并将其转换为单个整数(321)。

这是我到目前为止所做的:

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

我做错了什么?

2 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:3)

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

重复消息......它看起来就像数字321一样,这就是全部,它实际上与任何有意义的方式无关。所以,如果你真的需要实现这个值得怀疑的功能(我认为你不应该),那么你也可以做一下黑客实际利用“貌似”的东西。即,

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

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

<小时/> 1 除了在Haskell中实现纯函数通常非常简单之外......