函数需要中间结果时使用Haskell映射
我正在仔细阅读哈斯克尔的一篇文章,遇到了一个关于做出改变的问题。我得到了一个有序的(denomonation,numCoins)元组列表以及一个数量,需要返回一个列表,其中列出了每个硬币中有多少是用来兑换的。我有以下代码可以解决这个问题:函数需要中间结果时使用Haskell映射,haskell,Haskell,我正在仔细阅读哈斯克尔的一篇文章,遇到了一个关于做出改变的问题。我得到了一个有序的(denomonation,numCoins)元组列表以及一个数量,需要返回一个列表,其中列出了每个硬币中有多少是用来兑换的。我有以下代码可以解决这个问题: useCoins :: (Int,Int) -> Int -> Int useCoins (denomination, numCoins) target = min numCoins (target `div` denomination) mak
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
map
是一个错误的函数,因为正如您所注意到的,它只适用于每个元素都可以独立处理的情况,而不适用于元素相互依赖的情况
然而,
makeChange
是一个可以通过折叠实现的函数。具体来说,您的实现包含了左折叠的所有功能,但是是手工完成的;您可以使用foldl'
来实现函数。作为一般注意事项,请尽量避免在函数中使用“let”和“in”语句。这是一个非常“类似OOP”的方法,相反,试着考虑使用递归或where子句构造函数。我还建议您将函数类型语句抽象到最高层次,因此在这里使用“(Integral a)=>”将非常有用“@BabraCunninghamlet
vs,其中
主要是风格和个人偏好的问题。在我看来,OOP也不像。此外,let
在子表达式中可用,而where
不可用。不管它值多少钱,当函数体适合一行时,我倾向于使用where
,反之则使用let
。