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)
如果你尝试这样做:
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 的下一个问题的答案详细说明了为什么默认情况下不启用此选项。