tôi stumbled khi được thông báo biên soạn sau đây trong OCaml:Khi nào áp lực kép là hữu ích?
This simple coercion was not fully general. Consider using a double coercion.
Nó đã xảy ra trong một mã nguồn khá phức tạp, nhưng đây là một 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)
Bạn có thể biên dịch ví dụ này với ocamlfind ocamlc -c -package eliom.server -thread test.ml
, với Đã cài đặt Eliom 6.
Lỗi xảy ra trên dòng cuối cùng, nơi trình biên dịch OCaml phàn nàn rằng f_link
không thể chuyển đổi thành loại tfull
.
Ai đó có thể giải thích cho tôi tại sao nó không thể ép buộc f_link
-tfull
trực tiếp, nhưng nó là thể ép buộc nó để tfull
gián tiếp sử dụng tphrasing
như một bước trung?
Bất kỳ con trỏ nào đến lý thuyết loại đằng sau nó cũng sẽ được chào đón.
RTFM đẹp nhất mà tôi từng thấy :-) Thật vậy '(f_link: tphrasing:> tfull)' hoạt động như mong đợi, tôi không biết về thuật toán liên quan như vậy để tìm kiếm các loại tương thích. Cám ơn bạn rất nhiều về thông tin đó! –