如何匹配空元组列表?

时间:2013-02-06 15:08:09

标签: list f# tuples

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

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

remainingint s而不是元组的简单列表时,这很好用。如何匹配空元组列表?

2 个答案:

答案 0 :(得分:5)

[]可以匹配空元组列表。但是根据你的类型注释,remaining不是元组列表,它是一个包含int和int列表的元组。元组列表为(int*int) listint * 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