首页 > 解决方案 > 为什么我的使用尾递归的 F# 向量添加函数不起作用?

问题描述

我无法让它在 F# 中工作。我正在尝试编写向量加法的尾递归形式,并使用 a 传递先前计算的值。它给出错误“错误FS0001:类型不匹配。期望一个''a'
但给出一个''b列表->'c列表->'a列表'
类型''a'和''b列表->'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

标签: recursionvectorf#

解决方案


首先,您需要在(a::h1+h2). 否则,编译器会认为您正在调用vecaddwitha作为参数,然后将其添加到列表中。您的代码被解析为(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

推荐阅读