使函数在完成一些工作后返回自身

exe*_*ook 3 ocaml

let log x = print_int x; log ;;

log 111 222;;
Run Code Online (Sandbox Code Playgroud)

我期望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
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 8

如果你尝试这样做:

let log x = print_int x; log
Run Code Online (Sandbox Code Playgroud)

您正在返回log已经存在的类型float -> float,因此类型不匹配。

如果你试试:

let rec log x = print_int x; log
Run Code Online (Sandbox Code Playgroud)

类型系统变得混乱。你log正在接受一个int并返回...一个接受一个int并返回一个函数,一个接受一个int并返回...

这种递归性不起作用。

...除非您启用递归类型。

let log x = print_int x; log
Run Code Online (Sandbox Code Playgroud)

关联性注意事项:与as模式匹配中的 was 类似,这里它抓取左侧的所有内容,因此int -> 'a as 'a读作 as(int -> 'a) as 'a而不是int -> ('a as 'a)

OP 的下一个问题的答案详细说明了为什么默认情况下不启用此选项。