如何解析列表列表?

时间:2017-01-30 00:39:12

标签: ocaml

我是函数式编程和Ocaml的新手,我正在尝试编写一个函数,当给出列表列表时,检查每个列表的大小长度等于列表的其余部分,然后返回true,否则返回false。 / p>

例如:

[[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

2 个答案:

答案 0 :(得分:2)

你的问题陈述有点不清楚。我假设您被要求确定所有子列表的长度是否相同。如果是,则返回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_len函数。这可能是下一步的工作。

答案 1 :(得分:0)

您可以使用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