Verwaltungsstaat - Kapitel 3 der SICP
Ich habe in gearbeitetStruktur und Interpretation von Computerprogrammen und Abschluss der Übungen in Haskell. Die ersten beiden Kapitel waren in Ordnung (Code beiGithub) aber Kapitel 3 bringt mich zum Nachdenken.
Zunächst geht es um die Verwaltung des Staates am Beispiel eines Bankkontos. Sie definieren eine Funktionmake-withdraw
durch
<code>(define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds"))) </code>
damit Sie den folgenden Code ausführen können:
<code>(define w1 (make-withdraw 100)) (define w2 (make-withdraw 100)) (w1 50) 50 (w2 70) 30 (w2 40) "Insufficient funds" (w1 40) 10 </code>
Ich bin mir nicht sicher, wie ich das in Haskell nachahmen kann. Ich dachte zuerst an eine einfache Funktion mit der Staatsmonade:
<code>import Control.Monad.State type Cash = Float type Account = State Cash withdraw :: Cash -> Account (Either String Cash) withdraw amount = state makewithdrawal where makewithdrawal balance = if balance >= amount then (Right amount, balance - amount) else (Left "Insufficient funds", balance) </code>
was mir erlaubt, den Code auszuführen
<code>ghci> runState (do { withdraw 50; withdraw 40 }) 100 (Left "Insufficient funds",30.0) </code>
aber das macht etwas anderes als der Schema-Code. Im Idealfall könnte ich so etwas ausführen
<code>do w1 <- makeWithdraw 100 w2 <- makeWithdraw 100 x1 <- w1 50 y1 <- w2 70 y2 <- w2 40 x2 <- w1 40 return [x1,y1,y2,x2] [Right 50,Right 70,Left "Insufficient funds",Right 40] </code>
aber ich bin nicht sicher, wie ich die Funktion schreiben sollmakeWithdraw
. Irgendein Rat?