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
如果你尝试这样做:
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>
关联性注释:与 was 类似as
在模式匹配中工作,这里它抓住左边的所有东西,所以int -> 'a as 'a
读作(int -> 'a) as 'a
而不是int -> ('a as 'a)
.
答案OP的下一个问题详细说明为什么此选项默认情况下未启用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)