роль оператора |> против частичного применения - PullRequest
0 голосов
/ 25 марта 2020

У меня следующий код:

type transaction = Withdraw of int | Deposit of int | Checkbalance

(* Bank account generator. *)
let make_account(opening_balance: int) =
    let balance = ref opening_balance in
    fun (t: transaction) ->
      match t with
        | Withdraw(m) ->  if (!balance > m)
                          then
                            ((balance := !balance - m);
                            (Printf.printf "Balance is %i" !balance))
                          else
                            print_string "Insufficient funds."
        | Deposit(m) ->
           ((balance := !balance + m);
            (Printf.printf "Balance is %i\n" !balance)) 
        | Checkbalance -> (Printf.printf "Balance is %i\n" !balance)
;;

всякий раз, когда я пытаюсь выполнить следующую команду: make_account(100) Deposit(50) ;; Я получаю следующую ошибку: Эта функция имеет тип int -> транзакция -> единица измерения. Он применяется к слишком многим аргументам; может быть, вы забыли `; '.

Однако следующая команда отлично работает Deposit(50) |> make_account(100) ;;

Но почему эти две строки кода не эквивалентны? не следует (make_account 100) заменить на (fun (t: транзакция) -> ...)? Потому что тогда я не понимаю, почему моя первая попытка не сработала.

Спасибо!

1 Ответ

2 голосов
/ 25 марта 2020

Обратите внимание, что Ocaml не использует скобки для вызовов функций. В операторе

make_account (100) Deposit (50);;

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

make_account  100  Deposit  50 ;;

, где make_account применяется с тремя аргументами. То, что вы хотели написать, было

make_account 100 (Deposit 50);;

, что эквивалентно без скобок

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