1

以下函数在我尝试匹配空列表时给出编译错误:

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当是一个简单的ints 列表而不是元组时,这很好用。如何匹配一个空的元组列表?

4

2 回答 2

5

[]可以匹配一个空的元组列表。但是根据您的类型注释,remaining它不是元组列表,而是包含一个 int 和一个 int 列表的元组。元组列表将是(int*int) list. int * int list被解析为int * (int list),不是(int * int) list

如果您修复类型,您的代码应该可以正常工作。

于 2013-02-06T15:10:49.157 回答
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
于 2013-02-06T15:17:27.473 回答