Почему моя функция добавления вектора F # с использованием хвостовой рекурсии не работает? - PullRequest
0 голосов
/ 18 февраля 2019

Я не могу заставить это работать в F #.Я пытаюсь написать хвостовую рекурсивную форму добавления вектора и передать ранее вычисленные значения, используя.Это выдает ошибку "ошибка FS0001: Несоответствие типов. Ожидается '' a '
, но задано' 'список b ->' c список -> 'список'
Типы '' a 'и' 'b list -> 'c list ->' a list 'не может быть объединен. "

let rec vecadd a v1 v2 =
 match (v1, v2) with
 | ([], []) -> a
 | (h1::t1, h2::t2) -> vecadd a::h1+h2 t1 t2

1 Ответ

0 голосов
/ 18 февраля 2019

Прежде всего, вам необходимо добавить скобки вокруг (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...