Function Ocaml表达式类型混淆
我编写了这个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
(* 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的无偿转换(以及引用的使用)有点奇怪和不理想。我不明白你的编译器是如何抛出这个错误的。您的代码包含几个错误,在此之前应该检测到这些错误:
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);;
这是一个优雅的选项,而且它基于终端递归。但是,在该方案中,您可以自己重新定义函数,而无需使用预定义的函数遍历列表。你也可以在一轮中选择这两个数字,但这样做会有点复杂。我不明白你的编译器是如何抛出这个错误的。您的代码包含几个错误,在此之前应该检测到这些错误:
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);;