Первое, что я заметил, это то, что ваш код, как указано, всегда возвращает va
. Когда он достигает конца списка, он игнорирует накопленное значение ret
.
. Из-за этого трудно понять, что именно должна делать функция. Должны ли мы считать va
в конце списка или в начале? Реализуете ли вы правый или левый сгибы?
Допустим, вы реализуете левый сгиб и va
должен находиться в конце списка. Тогда вызов:
combine_all va op [e1; e2; e3]
эквивалентен этому выражению (используя + для представления параметра op
):
(((e1 + e2) + e3) + va)
Если это то, к чему вы стремитесь, один Решение, которое приходит мне в голову - рассмотреть список li @ [va]
. Этот список не пустой по построению. Поэтому вы всегда можете извлечь заголовок списка и использовать его в качестве начального накопленного значения (которое вы называете ret
). Затем вы применяете свою рекурсивную функцию к хвосту li @ [va]
.
Если вместо этого va
следует считать в начале списка, все еще проще. У вас уже есть голова и хвост непустого списка операндов: va
- это голова, а li
- это хвост.