銀行帳戶

銀行帳戶

中等

簡介

經過多年填表和等待,你終於拿到銀行執照了。這代表你現在正式有資格開設屬於自己的銀行,太棒了!

你的第一要務,就是讓資訊系統順利運作起來。經過一整天的努力,你已經可以開立和關閉帳戶,也能處理提款和存款了。

因為你懶得寫測試,所以你邀請了幾位朋友來幫忙測試系統。然而,才過了五分鐘,其中一位朋友就說他們的錢不見了!雖然你對自己的程式碼很有信心,確信它沒有 bug,但你還是開始翻查日誌來調查。

啊,果然如你所料,是你的朋友有問題!他們把自己的測試憑證分享給另一位朋友,兩個人一起密謀,_同時_從同一個帳戶存款和提款。誰會做這種事啊?

當你主張一個人_不可能_同時存取自己的帳戶時,你的朋友得意地提醒你,銀行規則_要求_你必須支援這種情況。所以說,沒有支援並行銀行作業,就沒有上線的許可。你嘆了口氣,在心裡記下明天要處理這件事。這會讓你的上線日期_至少_再延後一天,不過,唉……

說明

你的任務是實作銀行帳戶,支援開戶/關閉帳戶、提款與存款。

由於銀行帳戶可以透過許多不同的方式存取(網路、手機、自動扣款),你的銀行軟體必須讓帳戶能被多個執行緒/行程(術語取決於你使用的程式語言)安全地平行存取。 例如,可能同時有許多筆存款與提款正在進行;你需要確保在讀取帳戶餘額與設定新餘額之間不會發生競爭條件。

帳戶應該要可以關閉;對已關閉帳戶進行的操作必須失敗。

提示

完成這個練習時,你需要實作以下函式:

  • openAccount:在每個測試開始時呼叫,回傳一個 BankAccount。
  • closeAccount:在每個測試結束時呼叫。
  • getBalance:取得銀行帳戶的餘額。
  • updateBalance:依照指定金額增加銀行帳戶的餘額。

提款時,金額可以是負數。

銀行帳戶的初始餘額應該是 0。

檔案裡已經有虛設的資料宣告與型別簽章,但你需要自己定義這些函式,並建立有意義的資料型態、newtype 或型別同義詞。

如果需要協助,這裡提供一些額外資源:

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Haskell Exercism

準備好開始 銀行帳戶 了嗎?

註冊 Exercism,透過 107 個練習 和真人引導來學習並精通 Haskell,全部免費。