我似乎在为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中实现纯函数通常很简单之外