2014-09-22 46 views
0

如何编写一个函数,该函数从数值列表(如果存在)中返回最大值。如果给出空列表,则不能返回数字。如何编写一个函数来查找ocaml中的类型编号列表中的最大编号?

我得到:

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

我得到这个错误“这个表达键入数字,但预计int类型的表达式” IDK的如何采取输入号码,并返回输出号码选项。

回答

2

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

除此之外,您的代码有类型错误。这里有几个人去思考:

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

  2. max应用于列表元素和递归调用的返回值。在这里再次,类型不匹配。列表元素是数字,但是你的函数返回一个选项类型。

这看起来像一个任务,所以我不想多说这个。这可能会破坏它的重要性。

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函数,它应该是尾递归的。

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