我是函数式编程和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
答案 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