这一行OCaml:
String[] email_address = new String[] {getString(R.string.email_address)};
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", getString(R.string.email_address), null));
intent.putExtra(Intent.EXTRA_EMAIL, email_address);
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_subject_question));
startActivity(Intent.createChooser(intent, "Send Email"));
导致let c ~f = f() in let () = c (fun () -> ()) in ()
表达式出现以下错误:
c (fun () -> ())
没有File "tst.ml", line 1, characters 27-43:
Error: This expression has type f:(unit -> (unit -> unit) -> 'a) -> 'a
but an expression was expected of type unit
,就没有错误。如果我用~
明确标记参数,也没有错误。
标签如何弄乱?
答案 0 :(得分:3)
我相信,这里发生了什么。您尝试对带有标记参数的函数使用以下特殊情况:
作为特殊情况,如果函数具有已知的arity,则所有参数都是未标记的,并且它们的编号与非可选参数的数量匹配,然后忽略标签,并且非可选参数按其定义顺序进行匹配。可选参数是默认的。
(Section 7.7.1 of the OCaml manual。)
但是在你的定义中,c
并没有一个已知的arity。这是因为f
可以返回一个函数,因此c
可以返回一个函数。
由于特殊情况不适用,编译器必须假设已标记的参数~f:
尚未出现,并且 返回一个函数。因此,您可以获得您在示例中看到的打字。
如果您重新定义c
以使其具有已知的arity(以便它无法返回某个函数),那么事情就会按预期工作。
# let c ~f = [ f () ];;
val c : f:(unit -> 'a) -> 'a list = <fun>
# c (fun () -> ());;
- : unit list = [()]