我似乎正在努力解决Haskell中应该非常简单的事情,但我无法理解它,我需要一些帮助。我试图转换整数列表([3,2,1])并将其转换为单个整数(321)。
这是我到目前为止所做的:
fromDigits :: [Integer] -> Integer
fromDigits [] = 0;
fromDigits (x:xs) = x : fromDigits (xs)
我做错了什么?
答案 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中实现纯函数通常非常简单之外......