В Scala, как бы я смоделировал банковский счет без сохранения состояния и функциональности? - PullRequest
3 голосов
/ 23 июля 2011

В парадигме ОО вы можете иметь что-то вроде

class BankAccount(balance: Double) {
    def deposit(...)
    def withdraw(...)

}

Мне интересно, как вы делаете эквивалент в функциональной парадигме?

Ответы [ 2 ]

12 голосов
/ 23 июля 2011

Пусть каждый метод в классе BankAccount возвращает новый объект BankAccount с новым балансом.Таким образом, баланс может быть неизменной переменной.

class BankAccount(balance: Double) {
    def deposit(amount: Double): BankAccount
    def withdraw(amount: Double): BankAccount
}
1 голос
/ 01 января 2012

Сделайте учетную запись серией транзакций, а не только текущей суммой:

case class Transaction(numberOfSeashells: Int)
case class Account(transactions: Iterable[Transaction])

def addNewTransaction(startingBalance: Int, t: Transaction) = startingBalance + t.numberOfSeashells
def balance(account: Account) = account.transactions.foldLeft(0)(addNewTransaction)

val acct = Account(List(Transaction(3), Transaction(-1)))
val newBalance = balance(acct)

Результат:

scala>   val acct = Account(List(Transaction(3), Transaction(-1)))
acct: Account = Account(List(Transaction(3), Transaction(-1)))

scala>   val newBalance = balance(acct)
newBalance: Int = 2

Таким образом вы сможете удалить недействительные транзакции (возвратные платежи и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...