【发布时间】:2013-11-23 22:28:14
【问题描述】:
我正在尝试使用 foldr 函数在 Haskell 中定义一个函数:
fromDigits :: [Int] -> Int
这个函数接受一个 Int 列表(每个从 0 到 9)并转换为单个 Int。例如:
fromDigits [0,1] = 10
fromDigits [4,3,2,1] = 1234
fromDigits [2,3,9] = 932
fromDigits [2,3,9,0,1] = 10932
无论如何,我使用显式递归甚至使用 zipWith 来定义它都没有问题:
fromDigits n = sum (zipWith (*) n (map ((^)10) [0..]))
但现在我必须使用 foldr 来定义它,但我不知道如何获得 10 的幂。我所拥有的是:
fromDigits xs = foldr (\x acc -> (x*10^(???)) + acc) 0 xs
我怎样才能让它们减少?我知道我可以从 (length xs - 1) 开始,但是然后呢?
最好的问候
【问题讨论】:
-
你不能用
foldr (+) 0替换sum吗? :) -
神秘提示:
flip fmap (*10) `fmap` (+) -
在这种情况下看起来像左折叠会更自然。
标签: haskell decimal fold digits