自定义列表展平OCaml

自定义列表展平OCaml,ocaml,Ocaml,我目前正在做一个自定义版本的列表。展平,我在一个地方阻止了它。 我目前有: let rec doflatten (ls:int list list) (flatList: int list) : int list = match ls with | [] -> flatList | hd :: tl -> (doflatten (List.tl(ls)) (List.hd(hd) :: flatList)) 目前它可以编译,但是当我调用函数时,它会给我一个“失败hd”。

我目前正在做一个自定义版本的
列表。展平
,我在一个地方阻止了它。 我目前有:

let rec doflatten (ls:int list list) (flatList: int list) : int list =
  match ls with
  | [] -> flatList
  | hd :: tl -> (doflatten (List.tl(ls)) (List.hd(hd) :: flatList))
目前它可以编译,但是当我调用函数时,它会给我一个“失败hd”。假设它可以执行以下操作:

doflatten [[1;2;4]; []; [9]; [5;6]] [] = [1;2;4;9;5;6] 

您使用的是列表列表列表,因此在此模式中:

| hd :: tl -> ...
标题
hd
是一个列表

但是,
hd
可以是空列表。您的代码无法正确处理此情况。你只需要决定你想做什么

您可以有这样一个额外的图案:

| [] :: tl ->

此模式将与所讨论的案例相匹配。

您使用的是列表列表,因此在此模式中:

| hd :: tl -> ...
标题
hd
是一个列表

但是,
hd
可以是空列表。您的代码无法正确处理此情况。你只需要决定你想做什么

您可以有这样一个额外的图案:

| [] :: tl ->
此模式将与所讨论的案例相匹配