列表其余部分上的模式匹配

时间:2019-02-15 00:59:15

标签: ocaml

我正在尝试对配对列表进行模式匹配,在这里尝试从配对列表中返回列表,但是我很难弄清楚在哪里进行递归调用。没有递归调用,我有这个:

let countriesInChart (cht: chart) = 
  match cht with
  | [] -> []
  | (x,y)::tt -> [x;y]
;;

但是自然地,这仅适用于列表中的第一对,并且只返回["countryA"; "countryB"]而没有其余列表。

使用递归调用仅返回一个空列表:

let rec countriesInChart (cht: chart) = 
  match cht with
  | [] -> []
  | (x,y)::tt -> [x;y]::countriesInChart tt 
;;

我将如何进行递归调用,以使列表中的所有配对都作为列表返回?

1 个答案:

答案 0 :(得分:0)

你有这个:

[x;y] :: countriesInChart tt

这表示要将两个元素的新列表添加到列表列表的前面。

我不认为您想要一个列表列表,而只想要一个列表。因此,您不应该列出两个元素。

如果x和y是同一类型(我怀疑它们是同一类型),那么您可能想要的是:

x :: y :: countriesInChart tt

这表示将xy分别添加到递归生成的列表的前面。

您也可以这样写,这是完全等效的:

[x; y] @ countriesInChart tt

但是,这将构造两个元素的列表,只是将其丢弃。因此,这只是一点点额外的工作,无济于事。