Как заставить параметр принимать псевдо "нулевое" значение в зависимости от контекста в OCAML - PullRequest
0 голосов
/ 22 марта 2020

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

Проблема в том, что при создании вспомогательной функции я не знаю, как инициализировать дополнительный параметр для «NULL» типа данных, который функция будет принимать в качестве входных данных.

Например, если мы имеем дело с целыми числами, я бы хотел, чтобы мой параметр принял значение 0, 0. с плавающей точкой и для строки "".

Заранее спасибо!

let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) (ret:'a) = match li with
  | [] -> va
  | h :: t -> combine_all_aux va op t (op ret h)
;;

let combine_all va op li =
  combine_all_aux va op li (Something)
;;

Ответы [ 2 ]

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

Первое, что я заметил, это то, что ваш код, как указано, всегда возвращает va. Когда он достигает конца списка, он игнорирует накопленное значение ret.

. Из-за этого трудно понять, что именно должна делать функция. Должны ли мы считать va в конце списка или в начале? Реализуете ли вы правый или левый сгибы?

Допустим, вы реализуете левый сгиб и va должен находиться в конце списка. Тогда вызов:

combine_all va op [e1; e2; e3]

эквивалентен этому выражению (используя + для представления параметра op):

(((e1 + e2) + e3) + va)

Если это то, к чему вы стремитесь, один Решение, которое приходит мне в голову - рассмотреть список li @ [va]. Этот список не пустой по построению. Поэтому вы всегда можете извлечь заголовок списка и использовать его в качестве начального накопленного значения (которое вы называете ret). Затем вы применяете свою рекурсивную функцию к хвосту li @ [va].

Если вместо этого va следует считать в начале списка, все еще проще. У вас уже есть голова и хвост непустого списка операндов: va - это голова, а li - это хвост.

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

Благодаря @Джеффри я написал функцию, используя головку в качестве аккумулятора, что устраняет необходимость в дополнительном параметре.

let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) = match li with
  | [] -> va
  | h :: t -> op h (combine_all_aux va op t)
;;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...