Function Ocaml表达式类型混淆

Function Ocaml表达式类型混淆,function,tuples,ocaml,Function,Tuples,Ocaml,我编写了这个ocaml函数: (* int Base.List.t -> Base.Int.t x Base.Int.t *) let min_and_max lst = let mmax = ref Float.neg_infinity and mmin = ref Float.infinity in List.iter ~f:(fun v -> let fv = Float.of_int v in if fv > !mm

我编写了这个ocaml函数:

(* int Base.List.t -> Base.Int.t x Base.Int.t *)
let min_and_max lst =
  let mmax = ref Float.neg_infinity
  and mmin = ref Float.infinity in
    List.iter ~f:(fun v -> let fv = Float.of_int v in 
                  if fv > !mmax then mmax := fv
                  else if fv < mmin then mmin := fv)
              lst;
    (Int.of_float !mmin, Int.of_float !mmax)
错误指向该函数中的第一个
if
语句。我一定是犯了一个很明显的错误,但我看不出来


考虑到目前为止的答案和评论的解决方案:
让最小值和最大值=
匹配lst与
|[]->failwith“找不到空列表的最小值和最大值”
|v::[]->(v,v)
|a::b::rest->
设mmax=ref(最大a b)
和mmin=参考(最小a b)in
List.iter~f:(乐趣v->
如果v>!mmax,则mmax:=v;
如果v<!mmin,则mmin:=v)
休息
(!mmin,!mmax)

Base禁用多态比较:您需要使用本地open将浮点与
!mmax)
进行比较


p、 美国:对float的无偿转换(以及引用的使用)有点奇怪和不理想。

Base禁用多态比较:您需要使用本地open将float与
!mmax)
进行比较


p、 美国:对float的无偿转换(以及引用的使用)有点奇怪和不理想。

我不明白你的编译器是如何抛出这个错误的。您的代码包含几个错误,在此之前应该检测到这些错误:

  • 你用错了标签
  • 在else臂中,您正在与ref
    mmin进行比较,而不是与它的内容进行比较-您错过了
    -
  • 您将
    int\u of \u float
    函数与不存在的
    int.of \u float
    混淆
  • 此外,函数的逻辑原则不充分。例如,列表的第一个值将始终输入
    mmax
    变量,因为它将大于负无穷大。但是如果这个值是最小值呢

    除此之外,在这种情况下,将整数转换为浮点值是毫无意义的,并且会导致精度损失和性能下降。也没有必要使用参考文献

    这不是在OCaml上下文中进行操作的标准方法。在OCaml中,找到最简单的解决方案很重要,因为一旦开始使类型复杂化,就无法解决灾难

    我为您提出了一个更简单的解决方案,该方案允许您编写多态函数,而不仅仅是整数:

    let min_and_max lst =
        (List.fold_left (fun a b -> if a < b then a else b) (List.hd lst) lst),
        (List.fold_left (fun a b -> if a > b then a else b) (List.hd lst) lst);;
    
    让最小值和最大值=
    (List.fold_left(乐趣a b->如果a如果a>b,那么a else b)(List.hd lst)lst);;
    

    这是一个优雅的选项,而且它基于终端递归。但是,在该方案中,您可以自己重新定义函数,而无需使用预定义的函数遍历列表。你也可以在一轮中选择这两个数字,但这样做会有点复杂。

    我不明白你的编译器是如何抛出这个错误的。您的代码包含几个错误,在此之前应该检测到这些错误:

  • 你用错了标签
  • 在else臂中,您正在与ref
    mmin进行比较,而不是与它的内容进行比较-您错过了
    -
  • 您将
    int\u of \u float
    函数与不存在的
    int.of \u float
    混淆
  • 此外,函数的逻辑原则不充分。例如,列表的第一个值将始终输入
    mmax
    变量,因为它将大于负无穷大。但是如果这个值是最小值呢

    除此之外,在这种情况下,将整数转换为浮点值是毫无意义的,并且会导致精度损失和性能下降。也没有必要使用参考文献

    这不是在OCaml上下文中进行操作的标准方法。在OCaml中,找到最简单的解决方案很重要,因为一旦开始使类型复杂化,就无法解决灾难

    我为您提出了一个更简单的解决方案,该方案允许您编写多态函数,而不仅仅是整数:

    let min_and_max lst =
        (List.fold_left (fun a b -> if a < b then a else b) (List.hd lst) lst),
        (List.fold_left (fun a b -> if a > b then a else b) (List.hd lst) lst);;
    
    让最小值和最大值=
    (List.fold_left(乐趣a b->如果a如果a>b,那么a else b)(List.hd lst)lst);;
    

    这是一个优雅的选项,而且它基于终端递归。但是,在该方案中,您可以自己重新定义函数,而无需使用预定义的函数遍历列表。您也可以在一轮中选择这两个数字,但这样做会有点复杂。

    请注意,这样转换为浮点或从浮点转换为浮点,会失去精度。例如,
    min_和[115292150460684711]
    将返回
    (115292150460684704,115292150460684704)
    。请注意,通过这样转换浮点和从浮点转换,您将失去精度。例如,
    min_和[115292150460684711]
    将返回
    (115292150460684704,115292150460684704)
    。您能解释一下该语法吗。这是函数调用吗?它与常规比较有什么不同?这是一个局部打开:它将模块内定义的所有标识符引入当前范围。模块Base.Float定义了自己的
    操作符。因此,
    Float.(x>y)
    相当于
    Float(>)xy
    。您能解释一下该语法是什么吗。这是函数调用吗?它与常规比较有什么不同?这是一个局部打开:它将模块内定义的所有标识符引入当前范围。模块Base.Float定义了自己的
    操作符。因此,
    Float.(x>y)
    相当于
    Float。(>)xy
    。感谢您在未包含
    的情况下捕获该错误
    用于获取
    mmin的值
    
    let min_and_max lst =
        (List.fold_left (fun a b -> if a < b then a else b) (List.hd lst) lst),
        (List.fold_left (fun a b -> if a > b then a else b) (List.hd lst) lst);;