我有一个简单的函数(实际上用于项目Euler的某些问题)。它将数字列表转换为十进制数字。
fromDigits :: [Int] -> Integer
fromDigits [x] = toInteger x
fromDigits (x:xs) = (toInteger x) * 10 ^ length xs + fromDigits xs
我意识到
[Int]
类型不是理想的。 fromDigits
应该能够接受其他输入,例如序列,甚至foldables
...我的第一个想法是将上述代码替换为“带有状态的折叠”。上述功能的正确(=最小)Haskell分类是什么?
最佳答案
您应该避免使用length
并使用foldl
(或foldl'
)编写函数:
fromDigits :: [Int] -> Integer
fromDigits ds = foldl (\s d -> s*10 + (fromIntegral d)) 0 ds
从这一点到任何可折叠物品的概括都应该很清楚。