我有一个简单的函数(实际上用于项目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

从这一点到任何可折叠物品的概括都应该很清楚。

07-24 09:45