2017-01-09 69 views
3

我正在徹底查看Haskell文本,並且遇到了有關進行更改的問題。我給出了一個有序列表(denomonation,numCoins)元組以及一個數量,並且需要返回每個硬幣有多少用於進行更改的列表。我有以下代碼解決該問題:當函數需要中間結果時使用Haskell映射

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)) 

的問題是,這是在高階函數一章,我有一個很難拿出一個辦法來使用地圖作爲目標價值在整個列表中下降時發生變化。我很樂意提供任何幫助。

謝謝。

-mh

+0

作爲一般說明,儘量避免在函數中使用'let'和'in'語句。這是一個非常類似於OOP的類型,而是嘗試考慮使用遞歸構造函數,例如,或者使用where子句。我還建議你將函數類型語句設置爲最高抽象,所以在這裏使用'(Integral a)=>'會很有用' –

+1

@BabraCunningham'let' vs'where'主要是風格和個人問題偏愛。在我看來,它們都不像OOP。此外,'let'可用於子表達式,而'where'不是。對於它的價值,我傾向於在函數體適合一條線時使用'where',否則'let'。 – chi

回答

5

map是錯誤的功能使用,因爲當你注意到它僅適用於其中的每個元素都可以獨立處理,而不是當元素互相依賴的情況。

但是,makeChange是一個可以摺疊實現的功能。具體來說,你的實現包含了左邊的所有功能,但是手工完成;您可以改爲使用foldl'來實現您的功能。