OCaml中带标签的参数问题

时间:2017-08-20 03:06:19

标签: ocaml

这一行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 ,就没有错误。如果我用~明确标记参数,也没有错误。

标签如何弄乱?

1 个答案:

答案 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 = [()]