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
复制相似问题