Ocaml, где и как определить функцию, которая только возвращает значение - PullRequest
0 голосов
/ 14 января 2020

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

let mymain origarg = 
    let results = helperfunc origarg in (results, origarg)

let rec helperfunc newarg = match newarg with
    | [] -> []
    | h::t -> h::helperfunc (someotherfunc t origarg)

origarg - это список. Как мне написать функцию, которая может передавать неизмененное значение origarg моему помощнику c при каждом рекурсивном вызове?

Ответы [ 3 ]

0 голосов
/ 14 января 2020

Вы можете создать вспомогательную функцию, которая закрывается за origarg.

Прежде всего, вы не определили someotherfunc, вот та, которая удовлетворяет сигнатуре типа:

(* just to match the expected type *)
let someotherfunc x y = x @ y

Затем вы встраиваете определение для helperfunc в другую функцию:

let make_helperfunc origarg =
  let rec helperfunc newarg = match newarg with
    | [] -> []
    | h::t -> h::helperfunc (someotherfunc t origarg)
  in helperfunc

Каждый раз, когда вы вызываете make_helperfunc с данным origarg, эта функция создает другую функцию, локальную рекурсивную helperfunc функция, которая фиксирует в своей лексической среде переменную origarg. Возвращаемое значение называется замыканием .

В вашей основной функции сначала необходимо создать такое замыкание, используя origarg, и вызвать его:

let mymain origarg =
  let helper = make_helperfunc origarg in
  let results = helper origarg in (results, origarg)

Здесь аргумент helper также origarg, но это просто совпадение.

0 голосов
/ 16 января 2020

Если вы вложите функции, то origarg останется в области видимости так:

let mymain origarg = 
    let rec helperfunc newarg = match newarg with
    | [] -> []
    | h::t -> h::helperfunc (someotherfunc t origarg)
    in
    let results = helperfunc origarg in (results, origarg)
0 голосов
/ 14 января 2020

Непонятно, о чем ты спрашиваешь. Вы хотите, чтобы у helperfunc было два аргумента? Таким образом, один из них всегда будет иметь значение origarg, а другой будет меняться в зависимости от рекурсии.

Если это то, что вам нужно, вам нужно определить helperfunc, чтобы принять два аргумента. Ваше определение имеет только один аргумент. Вы хотите что-то вроде этого:

let rec helperfunc arg_1 arg_2 = ...

Когда вы вызываете helperfunc рекурсивно, вам необходимо предоставить оба аргумента. Первый аргумент будет arg_1. Вторым аргументом будет все, что вы хотите передать рекурсивному вызову.

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