Ich habe Haskell für eine Woche studiert und versucht, einige echte Weltfunktionen selbst zu schreiben. Mein Ziel ist es, die Geldsumme in Bezug auf die jeweiligen Münzen und die Menge dieser Münzen auszudrücken. Aber ich bin mir nicht sicher, ob ich "funktional" denke, wenn ich Funktionen schreibe. Beispielcode ist unten;Ausdrücken der Geldsumme in Bezug auf Änderungen
changes = [1,2,5,10,25,50]
makechanges n cs = if n `div` (last cs) > 0
then (coin_amount, last cs) : makechanges (n - coin_amount * current_coin) (init cs)
else makechanges n (init cs)
where coin_amount = n `div` (last cs)
current_coin = last cs
Beispiel Ausgabe ist
makechanges 126 changes
[(50,2),(25,1),(1,1)]
Gibt es eine FP Weise beabsichtigte Funktion zu schreiben? Ich fühle mich wie diese Funktion ist nur die Umwandlung der imperativen Funktion, danke im Voraus.
Eine offensichtliche Verbesserung wäre es, die 'changes' Liste rückgängig zu machen. Listen sind asymmetrisch, 'last' und' init' sind teuer, 'head' und' tail' sind billig. –
Danke für diesen Vorschlag, ich habe die Struktur der verknüpften Listen der Haskell-Listen völlig vergessen. –
Mein Stilvorschlag ist es, die Teilfunktionen 'head, tail' auch zu vergessen und einfach bei der Mustererkennung zu bleiben. Ich gebe auch das n.m. Vorschlag, die Liste umzukehren: Beginnen Sie mit der größeren Münze. – chi