Это проблема назначения:
В классе мы показали вам программу, которая имитирует транзакции, сделанные на банковском счете.Для этого мы впервые определили тип данных для транзакций:
тип транзакции = вывод int |Депозит int |CheckBalance |ChangePassword строки |Закрыть
Мы добавили две новые транзакции к примеру, выполненному в классе.В классе мы определили функцию make-account, которая генерирует банковский счет при начальном балансе.В этом упражнении вас попросят изменить этот код и создать защищенный паролем банковский счет.Любая транзакция по банковскому счету должна быть возможной, только если предоставлен правильный пароль.Для этого реализуйте функцию makeProtectedAccount с аргументами и типами, показанными ниже.let makeProtectedAccount (opensBalance: int, password: string) = Эта функция принимает начальный баланс в качестве первого аргумента и пароль в качестве второго и возвращает функцию, которая при задании правильного пароля и транзакции выполнит транзакцию.Одно важное отличие, которое следует отметить сразу, заключается в том, что в новом коде я хочу, чтобы вы печатали баланс на экране, а не возвращали его как значение.
Я пытался объявить функцию в OCaml, котораяпринимает в качестве входных данных кортеж.Но это дало мне ошибку, когда я попытался сообщить компилятору, какой тип у каждого элемента в кортеже.Однако компилятор компилируется, когда я ставлю круглые скобки вокруг определения типа каждого из элементов в кортежах.Кроме того, я попытался поместить несколько операторов в качестве последовательности выполнения сопоставленного регистра в операторе сопоставления, но компилятор не может его распознать.Как мы можем выполнить несколько операторов для сопоставленного регистра?
объявление функции с ошибкой компилятора:
makeProtectedAccount(openingBalance: int, password: string) =
объявление функции без ошибки компилятора:
makeProtectedAccount((openingBalance: int), (password: string)) =
Коды, которые я написал до сих пор, поскольку вы можете видеть, что компилятор не понимает, что | Deposit - это совпадающий регистр, так как он не делает отступ для оператора автоматически:
let makeProtectedAccount ( (openingBalance : int) , (password : string) ) =
let balance = ref openingBalance in
let pass = ref password in
fun (( passs : string ), (tras : transaction)) ->
if !passs = pass then
match trans with
| Withdraw q -> (if balance >= q then balance := !balance - q ; Printf.printf "withdrawing %d dollar, you have %d dollar left" q !balance
else Printf.printf "Invalid: withdrawing more money than you have!")
|Deposit q -> balance := !balance + q; Printf.printf "Deposit %d, you have now %d ", q !balance