如何编写一个函数来查找ocaml中类型编号列表中的最大数字?

时间:2014-09-22 18:36:29

标签: ocaml

如何编写一个函数,该函数返回数值列表中的最大数字(如果存在)。在给出空列表的情况下,它不能返回数字。

我得到:

let rec max_number_list l =
    match l with 
    |[] -> None
    |x::_ -> x
    |x::xs -> max x (max_number_list xs)

我收到此错误"此表达式具有类型编号,但表达式的类型为int" idk如何获取输入数字列表和返回输出数字选项。

3 个答案:

答案 0 :(得分:2)

我没有看到你提到错误的原因。实际上,此代码(如果已更正)可以应用于任何列表,因为max适用于任何OCaml类型。

除此之外,您的代码还有类型错误。以下是他们中的几个想法:

  1. 您的第一个案例会返回None,但您的第二个案例会从输入列表中返回一个值。如果你期望一个数字列表,这是行不通的。类型不一样。

  2. 您将max应用于列表的元素和递归调用的返回值。同样,这些类型不匹配。列表元素是数字,但您的函数返回选项类型。

  3. 这看起来像是一项任务,所以我不想再说这个了。它可能会破坏它的重点。

答案 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));;