gpt4 book ai didi

types - 使用带有可选参数的打印机输入格式

转载 作者:行者123 更新时间:2023-12-04 01:44:51 26 4
gpt4 key购买 nike

我正面临 OCaml typer 的一个有趣行为。打字机似乎无法接受带有可选参数的打印机。

当一个函数有可选参数时,它可以被定义为一个没有可选参数的函数。

(** Simple example *)
let (f1 : ?arg : int -> unit -> int) =
fun ?(arg = 3) () : int -> arg + 5

let f2 : ((unit -> int) -> int) =
fun f -> f ()

let x : int = f2 f1
(* The type of f1 matches the signature of f2 :
the optional argument is well discarded. *)

此处,f1 有一个可选参数,但 f2 f1 类型正确。这是因为(或者至少,这是我所理解的)f2 参数的签名包含 f1 的类型。可选参数被简单地丢弃。

但是,如本例所示,这种行为在打印机中是被拒绝的。

 (* Data structure *)
type 'a elt = {
data : int;
annot : 'a
}

(* Type of printer annotations *)
type 'annot printer = Format.formatter -> 'annot -> unit

(* Default printer prints nothing *)
let (default : 'a printer) = fun fmt _ -> Format.fprintf fmt ""

(* Generic printer for elts *)
let elt_printer
?(print_annot : 'a printer = default)
(fmt : Format.formatter)
(elt : 'a elt) =
Format.fprintf fmt "%i(%a)"
elt.data
print_annot elt.annot

(* I don't care about printing the annotation *)
let f (elt : _ elt) =
Format.printf
"%a"
elt_printer elt

这是在 fprintf̀ 调用中使用 elt_printer 时编译器返回的内容:

This expression has type
?print_annot:'a printer -> Format.formatter -> 'a elt -> unit
but an expression was expected of type Format.formatter -> 'b -> unit

我相信打字机设法推断出 'b = 'a elt,但未能丢弃可选参数。

关于这种行为我有两个问题:

  1. 这是第二个示例的预期行为吗?

  2. 如果不是,是否有禁止使用带有可选参数的函数的标准语法?例如,有没有办法禁止在第一个示例中使用 f1̀ 作为 f2 的参数?

提前谢谢你。

编辑:通过明确其类型,可以强制键入不带可选参数的 elt_printer

let f (elt : _ elt) =
Format.printf
"%a"
(elt_printer : _ printer) elt

编辑 2:对于带标签的参数,typer 严格阻止类型转换,因为必须为参数提供特定名称。这不是我的问题中提出的问题。

最佳答案

  1. 是的,这是预期的,函数 ?foo -> bar -> baz 不能转换为 bar -> baz 的函数。它只能在没有 foo 的情况下应用,这与隐式转换有很大不同

  2. 有两种解决方案

首先,您可以“不应用”标签:f ?print_annot:None 将通知打字机 f 的参数 print_annot应视为缺席。

其次,这是我用于 tyxml ( see here ) 的技术,您可以添加一个单元参数:

val pp : 
?encode:(string -> string) ->
?indent:bool ->
?advert:string ->
unit ->
Format.formatter -> doc -> unit

然后用户将拥有如下所示的代码:

let s = Format.asprintf "%a" (Tyxml.Html.pp ()) my_html

关于types - 使用带有可选参数的打印机输入格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55724192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com