Ich habe in Structure and Interpretation of Computer Programs gearbeitet und die Übungen in Haskell abgeschlossen. Die ersten beiden Kapitel waren in Ordnung (Code github), aber Kapitel 3 lässt mich härter denken.Verwaltungsstatus - Kapitel 3 von SICP
Es beginnt mit der Verwaltung von Staat, am Beispiel eines Bankkontos. Sie definieren eine Funktion make-withdraw
von
(define (make-withdraw balance)
(lambda (amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds")))
, so dass Sie den folgenden Code ausführen:
(define w1 (make-withdraw 100))
(define w2 (make-withdraw 100))
(w1 50)
50
(w2 70)
30
(w2 40)
"Insufficient funds"
(w1 40)
10
Ich bin nicht sicher, wie ich das in Haskell emulieren kann. Ich dachte zuerst an ein paar einfache Funktion der Staat Monade mit:
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)
, die mir den Code
ghci> runState (do { withdraw 50; withdraw 40 }) 100
(Left "Insufficient funds",30.0)
aber das macht etwas anderes Schema Code laufen zu lassen. Im Idealfall würde ich in der Lage sein, so etwas wie
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]
laufen, aber ich bin nicht sicher, wie die Funktion makeWithdraw
zu schreiben. Irgendein Rat?
Danke, das ist eine großartige Antwort. –