2014-12-06 4 views
7

Вот минимальный пример из моего кода, демонстрирующего проблему:Значение не полиморфный достаточно

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). Я почти уверен, что меня укусят ограничение стоимости здесь, и я не совсем уверен, как обойти это.

ответ

5

Да, это ограничение значения. Вам необходимо, чтобы это расширило проблематичное определение, например:

let p = Parse (fun x -> Parser.return "xxx" x) 

Раздражающий, не так ли?

Если вы хотите, чтобы привязка была полиморфной, вам обычно нужно убедиться, что это «синтаксическое значение». Выражение, содержащее частичное приложение, не подходит (потому что в целом частичные приложения могут иметь эффект), но (fun ...) в порядке.

Смежные вопросы