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

问题描述 投票:0回答:4

如何编写一个从数值列表(如果存在)中返回最大数字的函数。如果给定空列表,则它无法返回数字。

我明白:

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

我收到此错误“此表达式的类型为 number,但表达式应为 int 类型” idk 如何获取输入数字列表并返回输出数字选项。

ocaml
4个回答
2
投票

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

max
适用于任何 OCaml 类型。

除此之外,您的代码存在类型错误。以下是一些值得思考的问题:

  1. 您的第一个案例返回

    None
    ,但您的第二个案例返回输入列表中的值。如果您需要一个数字列表,那么这是行不通的。类型不一样。

  2. 您将

    max
    应用于列表的元素和递归调用的返回值。再次,类型不匹配。列表元素是数字,但您的函数返回选项类型。

这看起来像是一个作业,所以我不想再多说了。这可能会破坏它的意义。


1
投票

我能想到的最简单的代码:

(* 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

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”,它可以引发给定字符串的异常 Failure。并且不会导致类型错误。
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));;
© www.soinside.com 2019 - 2024. All rights reserved.