Ocaml 如何解析列表列表?
我不熟悉函数编程和Ocaml,我正在尝试编写一个函数,当给定一个列表列表时,检查每个大小长度等于其余列表的列表,并返回true或false 例如: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
[[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
(这无助于大局中的人们为他们做家庭作业。)