recursion - 为什么我的使用尾递归的 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
解决方案
首先,您需要在(a::h1+h2)
. 否则,编译器会认为您正在调用vecadd
witha
作为参数,然后将其添加到列表中。您的代码被解析为(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
推荐阅读
- java - 如何使用 Java 中的 math.random() 函数让计算机在我的 Connect4 游戏中选择随机列?
- mysql - 如何检测数据库断开连接,并使用 go-xorm 有效地重新连接 mysql、tiDB 等数据库?
- javascript - Web3如何调用返回字节32的方法?
- node.js - Mongoose 多文档事务不起作用
- javascript - MongoDB 仅返回来自其他文档的用户与字段不匹配的文档
- android - 在excel中添加三个数组时出现java.lang.IndexOutOfBoundsException
- unity3d - 如何使用 NativeList 之类的东西
>? 或任何其他替代方式? - localization - 如何在我的 AngularJS 代码中翻译字符串?
- android - 如何使用listview从firebase检索所有数据到页面上?
- c# - C# 强制子类实现 Serializable