如何编写一个函数,该函数返回数值列表中的最大数字(如果存在)。在给出空列表的情况下,它不能返回数字。
我得到:
let rec max_number_list l =
match l with
|[] -> None
|x::_ -> x
|x::xs -> max x (max_number_list xs)
我收到此错误"此表达式具有类型编号,但表达式的类型为int" idk如何获取输入数字列表和返回输出数字选项。
答案 0 :(得分:2)
我没有看到你提到错误的原因。实际上,此代码(如果已更正)可以应用于任何列表,因为max
适用于任何OCaml类型。
除此之外,您的代码还有类型错误。以下是他们中的几个想法:
您的第一个案例会返回None
,但您的第二个案例会从输入列表中返回一个值。如果你期望一个数字列表,这是行不通的。类型不一样。
您将max
应用于列表的元素和递归调用的返回值。同样,这些类型不匹配。列表元素是数字,但您的函数返回选项类型。
这看起来像是一项任务,所以我不想再说这个了。它可能会破坏它的重点。
答案 1 :(得分:0)
在这里:
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 ",这可以使用给定的字符串引发异常失败。它不会导致类型错误。
2.您可以定义 HELPER 函数,该函数应该是尾递归的。
答案 2 :(得分:0)
我还建议使用以下代码:
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));;