Tôi đã làm việc qua số Structure and Interpretation of Computer Programs và hoàn thành các bài tập trong Haskell. Hai chương đầu tiên là tốt (mã số github) nhưng Chương 3 khiến tôi suy nghĩ nhiều hơn.Nhà nước quản lý - chương 3 của SICP
Bắt đầu bằng cách nói về quản lý trạng thái, với ví dụ về tài khoản ngân hàng. Họ định nghĩa một hàm make-withdraw
bởi
(define (make-withdraw balance)
(lambda (amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds")))
để bạn có thể thực hiện đoạn mã sau:
(define w1 (make-withdraw 100))
(define w2 (make-withdraw 100))
(w1 50)
50
(w2 70)
30
(w2 40)
"Insufficient funds"
(w1 40)
10
Tôi không chắc chắn làm thế nào tôi có thể bắt chước này trong Haskell. đầu tiên tôi nghĩ đến một số chức năng đơn giản bằng cách sử dụng đơn nguyên nhà nước:
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)
cho phép tôi để chạy mã
ghci> runState (do { withdraw 50; withdraw 40 }) 100
(Left "Insufficient funds",30.0)
nhưng điều đó làm điều gì đó khác nhau để mã chương trình. Lý tưởng nhất là tôi có thể chạy một cái gì đó như
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]
nhưng tôi không chắc chắn cách viết hàm makeWithdraw
. Lời khuyên nào?
Cảm ơn, đây là một câu trả lời tuyệt vời. –