我在 OCaml 中偶然发现了以下编译消息:
This simple coercion was not fully general. Consider using a double coercion.
它发生在一个相当复杂的源代码中,但这里是一个 MNWE:
open Eliom_content.Html.D
let f_link s =
let arg : Html_types.phrasing_without_interactive elt list = [pcdata "test"] in
[ Raw.a ~a:[a_href (uri_of_string (fun () -> "test.com"))] arg ]
type tfull = (string -> Html_types.flow5 elt list)
type tphrasing = (string -> Html_types.phrasing elt list)
let a : tfull = ((f_link :> tphrasing) :> tfull)
let b : tfull = (f_link :> tfull)
ocamlfind ocamlc -c -package eliom.server -thread test.ml
您可以使用安装了 Eliom 6的 编译此示例。
错误发生在最后一行,OCaml 编译器抱怨f_link
无法转换为 type tfull
。
有人可以向我解释为什么不能直接强制f_link
,tfull
但可以强制它tfull
间接tphrasing
用作中间步骤吗?
任何指向其背后的类型理论的指针也将受到欢迎。