Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数需要中间结果时使用Haskell映射_Haskell - Fatal编程技术网

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

函数需要中间结果时使用Haskell映射,haskell,Haskell,我正在仔细阅读哈斯克尔的一篇文章,遇到了一个关于做出改变的问题。我得到了一个有序的(denomonation,numCoins)元组列表以及一个数量,需要返回一个列表,其中列出了每个硬币中有多少是用来兑换的。我有以下代码可以解决这个问题: useCoins :: (Int,Int) -> Int -> Int useCoins (denomination, numCoins) target = min numCoins (target `div` denomination) mak

我正在仔细阅读哈斯克尔的一篇文章,遇到了一个关于做出改变的问题。我得到了一个有序的(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

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


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

来实现函数。作为一般注意事项,请尽量避免在函数中使用“let”和“in”语句。这是一个非常“类似OOP”的方法,相反,试着考虑使用递归或where子句构造函数。我还建议您将函数类型语句抽象到最高层次,因此在这里使用“(Integral a)=>”将非常有用“@BabraCunningham
let
vs
,其中
主要是风格和个人偏好的问题。在我看来,OOP也不像。此外,
let
在子表达式中可用,而
where
不可用。不管它值多少钱,当函数体适合一行时,我倾向于使用
where
,反之则使用
let