Recursion 为什么使用尾部递归的F#向量加法函数不起作用?

Recursion 为什么使用尾部递归的F#向量加法函数不起作用?,recursion,vector,f#,Recursion,Vector,F#,我不能让它在F#工作。我正在尝试编写一个向量加法的尾部递归形式,并使用a传递先前计算的值。它给出了错误“错误FS0001:类型不匹配。应为 “a” 但是给一个 “b列表->”c列表->“a列表” 无法统一类型“a”和“b列表->”c列表->“a列表” 首先,需要在(a::h1+h2)周围添加括号。否则,编译器认为您正在调用vecadd,并将a作为参数 然后在列表前加上。您的代码将被解析为(vecada)::h1+h2 添加括号后,还有一个问题。在递归调用中,参数a::h1+h2不正确-运算符::

我不能让它在F#工作。我正在尝试编写一个向量加法的尾部递归形式,并使用a传递先前计算的值。它给出了错误“错误FS0001:类型不匹配。应为 “a”
但是给一个 “b列表->”c列表->“a列表”
无法统一类型“a”和“b列表->”c列表->“a列表”


首先,需要在
(a::h1+h2)
周围添加括号。否则,编译器认为您正在调用
vecadd
,并将
a
作为参数 然后在列表前加上。您的代码将被解析为
(vecada)::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
let rec vecadd a v1 v2 =
 match (v1, v2) with
 | ([], []) -> List.rev a
 | (h1::t1, h2::t2) -> vecadd (h1+h2::a) t1 t2