проблема с тем, как мы определяем кортежи как входные функции в OCaml - PullRequest
0 голосов
/ 07 февраля 2019

Это проблема назначения:

В классе мы показали вам программу, которая имитирует транзакции, сделанные на банковском счете.Для этого мы впервые определили тип данных для транзакций:

тип транзакции = вывод 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 

1 Ответ

0 голосов
/ 07 февраля 2019

Несколько вопросов здесь

Как написать функцию, которая принимает кортеж

Как вы сделали, или

let makeProtectedAccount ((openingBalance, password): int*string) = 

Как написать несколько операторов в match case

Также, как вы это сделали

match trans with 
| Withdraw q -> Printf.printf "statement 1\n"; Printf.printf "statement 2\n" 
| Deposit q  -> Printf.printf "statement 3\n"; Printf.printf "statement 4\n"

Я думаю, что проблема заключается в случайном , в вашем последнем printf.Кроме того, passs не является ref, нет необходимости разыменовывать его с помощью !.Кроме того, заключите в скобки операторы в then ветви

Это должно работать, например,

let makeProtectedAccount ((openingBalance:int), (password:string)) =
      let balance = ref openingBalance in
      let pass = ref password in
      function 
      | p, Withdraw q when p = !pass -> 
           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!"
      | p, Deposit q when p = !pass -> balance := !balance + q; Printf.printf "Deposit %d, you have now %d " q !balance 
      | _, _ -> ()

Кстати, если нет особой причинычтобы принять кортеж, было бы более логично написать function с двумя параметрами

let makeProtectedAccount (openingBalance:int) (password:string) =
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...