2014-09-22 28 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));;