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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage