当函数需要中间结果时使用Haskell映射

时间:2017-01-09 00:31:44

标签: haskell

我正在深入研究Haskell文本并遇到了一个关于进行更改的问题。我给了一个(denomonation,numCoins)元组的有序列表以及一个数量,需要返回一个列表,列出每个硬币用于进行更改的数量。我有以下代码解决了这个问题:

useCoins :: (Int,Int) -> Int -> Int
useCoins (denomination, numCoins) target = min numCoins (target `div` denomination)

makeChange :: [(Int, Int)] -> Int -> [Int]
makeChange [] target = []
makeChange ((denomination, numCoins):xs) target = 
  let
     coinsUsed = useCoins (denomination, numCoins) target
  in coinsUsed : makeChange xs (target - (coinsUsed * denomination))

问题在于这是关于高阶函数的一章,我很难想出一种使用map的方法,因为当目标值从列表中删除时它会发生变化。我很乐意帮忙。

感谢。

-mh

1 个答案:

答案 0 :(得分:5)

map是一个错误的函数,因为你注意到它只适用于每个元素可以独立处理的情况,而不是当元素相互依赖时。

但是,makeChange是一个可通过折叠实现的功能。具体来说,您的实现包含了左折叠的所有功能,但是手工完成;您可以使用foldl'

来实现您的功能