Вот минимальный пример из моего кода, демонстрирующего проблему:Значение не полиморфный достаточно
module Substring = struct
type t = {
base: string;
pos: int;
len: int
}
end
module Parser = struct
type 'a t = Substring.t -> ('a * Substring.t) option
let return x s = Some (x, s)
end
type (_, _) t =
| TryParse : unit Parser.t -> ('a, 'a) t
| Parse : 'b Parser.t -> ('a, 'b -> 'a) t
| Concat : ('b, 'c) t * ('a, 'b) t -> ('a, 'c) t
let p = Parse (Parser.return "xxx")
Моя проблема заключается в том, что я хочу val p : ('a, string -> 'a) t
быть полиморфными и еще OCaml делает 'a
слабым: val p : ('_a, string -> '_a)
. Я почти уверен, что меня укусят ограничение стоимости здесь, и я не совсем уверен, как обойти это.