Прежде всего, вам необходимо добавить скобки вокруг (a::h1+h2)
.В противном случае компилятор считает, что вы вызываете vecadd
с a
в качестве аргумента, а затем добавляете его в список.Вместо этого ваш код анализируется как (vecadd a)::h1+h2
.
Как только вы добавите скобки, возникает еще одна проблема.В вашем рекурсивном вызове аргумент a::h1+h2
неверен - оператор ::
добавляет значение в начало списка, поэтому он принимает значение и список значений.В вашем случае вы пытаетесь использовать его, чтобы добавить значение в конец списка.
Это можно исправить, используя h1+h2::a
, чтобы добавить новый элемент в начало списка, а затем перевернуть список перед возвратом в случае [], []
:
let rec vecadd a v1 v2 =
match (v1, v2) with
| ([], []) -> List.rev a
| (h1::t1, h2::t2) -> vecadd (h1+h2::a) t1 t2