Может кто-нибудь объяснить, как работает эта функция OCaml, которая переворачивает элементы списка? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть функция OCaml, которую я получил из поста: Список переворачивается в Ocaml

let rev_list l =
      let rec rev_acc acc = function
        | [] -> acc
        | hd::tl -> rev_acc (hd::acc) tl
      in 
      rev_acc [] l

Я проверил это, и это, очевидно, сработало, но я не понимаю, почему. Внутри основной функции при определении rev_acc он говорит, что принимает только аргумент acc. Однако при этом вызывается функция с двумя параметрами. Почему нам разрешено это делать?

Кроме того, почему мы говорим let rec rev_acc acc = function, что означает «= функция», и почему мы не используем совпадение? Я предполагаю, что это связано с отсутствием необходимости указывать определенные аргументы; Я кое-что помню об этом в последней части курса, которая была кратко освещена. Это как-то связано с карри?

Извините, если это глупые вопросы; Я довольно новичок в функциональном программировании, если это не было очевидно.

Любая помощь очень ценится. Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы правы, что rev_acc - это функция, которая принимает один аргумент.НО потом возвращает функцию, принимающую другой аргумент.Поэтому, когда вы пишете

rev_acc [] l

, на самом деле происходит

let unnamed_function = rev_acc []
in
unnamed_function l
0 голосов
/ 17 мая 2018

Ocaml имеет специальный синтаксис function, который принимает неявный аргумент и автоматически вставляет его в выражения соответствия, следующие за

Функция rev_acc в вашей программе определяется с помощью function

let rec rev_acc acc = function
  | [] -> acc
  | hd::tl -> rev_acc (hd::acc) tl

Это эквивалентно

let rec rev_acc acc xs =
  match xs with
    | [] -> acc
    | hd::tl -> rev_acc (hd::acc) tl 

Выше каждая версия rev_acc принимает два аргумента

...