如何编写一个从数值列表(如果存在)中返回最大数字的函数。如果给定空列表,则它无法返回数字。
我明白:
let rec max_number_list l =
match l with
|[] -> None
|x::_ -> x
|x::xs -> max x (max_number_list xs)
我收到此错误“此表达式的类型为 number,但表达式应为 int 类型” idk 如何获取输入数字列表并返回输出数字选项。
我没有看到你提到的错误的原因。事实上,这段代码(如果更正)可以应用于任何列表,因为
max
适用于任何 OCaml 类型。
除此之外,您的代码存在类型错误。以下是一些值得思考的问题:
您的第一个案例返回
None
,但您的第二个案例返回输入列表中的值。如果您需要一个数字列表,那么这是行不通的。类型不一样。您将
max
应用于列表的元素和递归调用的返回值。再次,类型不匹配。列表元素是数字,但您的函数返回选项类型。这看起来像是一个作业,所以我不想再多说了。这可能会破坏它的意义。
我能想到的最简单的代码:
(* int list -> int *)
let max_number_list lst = List.fold_left max min_int lst
如果您认为核心库是我能想到的最简单的代码:
(* int list -> int option *)
let max_number_list lst = List.reduce lst ~f:max
给你:
let test l =
match l with
[] -> failwith "None"
|h::t -> let rec helper (seen,rest) =
match rest with
[] -> seen
|h'::t' -> let seen' = if h' > seen then h' else seen in
let rest' = t'
in helper (seen',rest')
in helper (h,t)
说明:
1. 使用“Failwith”,它可以引发给定字符串的异常 Failure。并且不会导致类型错误。
2. 您可以定义一个 HELPER 函数,该函数应该是尾递归的。
我还建议使用以下代码:
List.fold <mylist> ~init:None ~f:(fun acc x -> if is_none acc then Some x else Some ( max (Option.value acc ~default:0) x));;