以下函数在我尝试匹配空列表时给出了编译错误:
let rec tuplesToList (acc: int list) (remaining: int*int list) =
match remaining with
| [] -> acc
| (a, b) :: tail -> tuplesToList (a :: b :: acc)
错误是:
This expression was expected to have type int * int list but here has type 'a list
当remaining
是int
s而不是元组的简单列表时,这很好用。如何匹配空元组列表?
答案 0 :(得分:5)
[]
可以匹配空元组列表。但是根据你的类型注释,remaining
不是元组列表,它是一个包含int和int列表的元组。元组列表为(int*int) list
。 int * int list
被解析为int * (int list)
,而不是(int * int) list
。
如果你修复了这个类型,你的代码应该可以正常工作。
答案 1 :(得分:2)
除了sepp2k的观察之外,你还忘记了递归调用中的第二个参数(tail
)。此外,您的代码可以正常工作,无需任何类型的注释:
let rec tuplesToList acc remaining =
match remaining with
| [] -> List.rev acc //reverse to preserve original order
| (a, b) :: tail -> tuplesToList (a :: b :: acc) tail