【问题标题】:how to write a function to find max number in a list of type number in ocaml?如何编写一个函数来在 ocaml 的类型编号列表中查找最大编号?
【发布时间】:2014-11-16 19:45:36
【问题描述】:

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

我明白了:

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

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

【问题讨论】:

    标签: ocaml


    【解决方案1】:

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

    除此之外,您的代码还有类型错误。这里有几个需要考虑:

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

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

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

    【讨论】:

      【解决方案2】:

      给你:

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

      【讨论】:

        【解决方案3】:

        我还建议使用以下代码:

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

        【讨论】:

          猜你喜欢
          • 2019-03-24
          • 1970-01-01
          • 2022-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-26
          相关资源
          最近更新 更多