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
作爲一般說明,儘量避免在函數中使用'let'和'in'語句。這是一個非常類似於OOP的類型,而是嘗試考慮使用遞歸構造函數,例如,或者使用where子句。我還建議你將函數類型語句設置爲最高抽象,所以在這裏使用'(Integral a)=>'會很有用' –
@BabraCunningham'let' vs'where'主要是風格和個人問題偏愛。在我看來,它們都不像OOP。此外,'let'可用於子表達式,而'where'不是。對於它的價值,我傾向於在函數體適合一條線時使用'where',否則'let'。 – chi