OCAML: неправильная форма функции - PullRequest
1 голос
/ 08 февраля 2020

У меня есть функция everyNth, которая принимает список, созданный пользователем, а также число i и создает новый список с каждым кратным i, найденным в списке, созданном пользователем. Например, если я ввел

everyNth[1; 2; 3; 4; 5; 6] 3;;

, результат будет

int list = [3; 6]

, эта функция в настоящее время имеет вид

int list-> int -> int list

, и мне нужно, чтобы она была

('a list) -> int -> ('a list)

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

let everyNth a i = 
  let rec aux = function
    |[]->[]
    |h :: t -> if h mod i = 0 then h::aux t else aux t in aux a;;

1 Ответ

1 голос
/ 08 февраля 2020

По сути, вы хотите иметь значение, которое отслеживает вашу позицию при обработке списка. При обработке первого элемента значение равно 1. Затем 2 для следующего элемента и так далее. В функциональном программировании, однако, нет способа изменить значение переменной. Таким образом, вы не можете себе представить, что вы увеличиваете одно значение. Вместо этого вы должны представить наличие параметра функции, который на 1 больше для каждого рекурсивного вызова.

Вот функция, которая возвращает 4-й элемент списка, используя эту технику:

let fourth list =
    let rec aux i l =
        match l with
        | [] -> failwith "List too short"
        | h :: t -> if i = 4 then h else aux (i + 1) t
    in
    aux 1 list

(В Дело в том, что OCaml является языком с множеством парадигм, и вы можете иметь изменяемые переменные, значение которых можно изменить. Но я думаю, что это то, чему мы научимся позже.)

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