Ocaml 如何解析列表列表?

Ocaml 如何解析列表列表?,ocaml,Ocaml,我不熟悉函数编程和Ocaml,我正在尝试编写一个函数,当给定一个列表列表时,检查每个大小长度等于其余列表的列表,并返回true或false 例如: [[5;2;4];[1;3]] -> false [[1;2];[1;3]] -> true 所以我的第一个问题,开始解决我的问题,是如何解析列表列表 尝试: let rec check_if_equal list = match list with [[h]] -> true |[h]::rest -> l

我不熟悉函数编程和Ocaml,我正在尝试编写一个函数,当给定一个列表列表时,检查每个大小长度等于其余列表的列表,并返回true或false

例如:

[[5;2;4];[1;3]] -> false
[[1;2];[1;3]] -> true
所以我的第一个问题,开始解决我的问题,是如何解析列表列表

尝试:

let rec check_if_equal list = match list with
    [[h]] -> true
    |[h]::rest -> let find_len list_len = match list_len with
       [[]] -> 0
       |_::t -> 1 + find_len t

你的问题陈述有点不清楚。我假设您被要求确定所有子列表的长度是否相同。如果是,则返回true;如果不是,则返回false

我也不知道你所说的“解析”是什么意思。很可能你说的是模式匹配部分。最好的开始方法是忘记元素的类型,只把输入看作一个列表

因此,如果您遵循示例代码,最外层的函数可能如下所示:

let rec check_if_all_same_length lists =
    match lists with
    | [] -> true (* Vacuously true *)
    | _ :: [] -> true (* One list is same length as itself *)
    | h1 :: h2 :: t -> (* Two or more lists is the hard part *)
计算列表长度的代码看起来相当不错。但请注意,这些是原始列表的子列表。所以它们不一定是列表的列表,它们只是列表。因此,您应该在列表的末尾匹配
[]
。您还应该将其声明为递归函数


请注意,没有人调用
find\u len
函数。这可能是下一步要做的事情。

您可以使用List.length

   let rec check_if_equal = function
      | [] | _::[]  -> true
      | h1::h2::[]  -> List.length h1=List.length h2
      | h1::h2::tl  -> check_if_equal (h1::[h2]) && check_if_equal (h2::tl)
    ;;
测试:

# check_if_equal [[5;2;4]];;
- : bool = true
# check_if_equal [[5;2;4];[1;3;6];[4]];;
- : bool = false
# check_if_equal [[1;2];[1;3]];;
- : bool = true

(这无助于大局中的人们为他们做家庭作业。)