从整数到单个整数的列表-Haskell



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

以下是我目前所拥有的:

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

我做错了什么?

您可以使用worker包装方法来实现这一点:

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中,这个真的没有理由特别简单。幸运的是,这不是JavaScript。

重复消息。。。它看起来像数字321,仅此而已,它与数字没有任何意义。因此,如果你真的需要实现这个价值可疑的功能(我认为你不应该),那么你也可以通过破解来真正利用“看起来像;事情即

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

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


1除了在Haskell中实现纯函数通常很简单之外

最新更新