let log x = print_int x; log ;;
log 111 222;;我期望log打印111并返回自身,然后在第二个调用中打印222,但是它不能像预期的那样工作,而是得到一个错误消息。为什么?如何使它像预期的那样工作?
我也尝试过rec,但没有结果。
File "./hello.ml", line 3, characters 8-11:
3 | log 111 222;;
^^^
Error: This expression has type int but an expression was expected of type
float发布于 2022-10-18 20:48:20
如果你尝试这个:
let log x = print_int x; log您正在返回已经存在的log,它的类型为float -> float,因此类型不匹配。
如果你尝试:
let rec log x = print_int x; log类型系统变得混乱了。你的log拿着int回来了..。一个函数,它接受一个int,并返回一个接受int并返回.
这种递归不起作用。
..。除非您启用递归类型。
% ocaml -rectypes
OCaml version 4.14.0
Enter #help;; for help.
# let rec log x = print_int x; log;;
val log : int -> 'a as 'a = <fun>
# log 222 111;;
222111- : int -> 'a as 'a = <fun>回答了为什么默认情况下不打开此选项的OP's next question详细信息。
发布于 2022-10-18 20:49:49
除非您将log声明为递归函数,否则它的返回值将是其他函数,即log的前面定义。实际上,log是一个接受浮动值并返回浮动值的函数。
如果您确实将log声明为递归的,那么您将有进一步的问题。特别是,您的函数将具有递归类型。您可以使用-rectypes标志使其工作。
(我会更详细地解释,但克里斯在我写这篇文章时给出了一个很好的解释。)
https://stackoverflow.com/questions/74117157
复制相似问题