У меня есть несколько сложная проблема ввода текста, по крайней мере для меня.Элегантное типизированное решение желаемое, ввод одного параметра является функцией другого
говорят, что мы имеем это:
type rr = A | AAA | BBB
type resolve_result_t = List of string list
| MX_records of mx_record list
| Srv of srv_record list
| Soa of soa_record
| Error of string
and mx_record = { exchange : string; priority: int; }
and srv_record = { priority: int; weight : int; port : int; name : string; }
and soa_record = { nsname : string;
hostmaster: string;
serial : int;
refresh: int;
retry : int;
expire : int;
minttl : int; }
let resolve ?(rr_type=A) ~host (f : (resolve_result_t -> unit) : unit =
match rr_type with
| A ->
let g = fun raw -> f (List (raw |> some_string_list_func))
...code that uses g
| BBB ->
let g = fun raw -> f (MX_records (raw |> some_mx_record_list_func))
...
то в коде вызывающего абонента мы должны делать вещи, как это:
resolve ~host:"google.com" begin function
List l -> .. code that uses l | _ -> assert false (* Or deal with the warning *)
end
или
resolve ~rr_type:BBB ~host:"google.com" begin function
MX_records l -> ...similiar to previous example.
Даже если эти другие случаи никогда не может происходит, поскольку набрание функции зависит от ввода другого параметра.
Я продолжаю думать, что есть какой-то системный трюк или использование GADT, но я никогда не уверен полностью, когда мне нужно связаться с ними.
Спасибо, будем стараться теперь. Какая у вас интуиция позволила вам узнать, как использовать GADT? –
Так я знаю, чтобы строить отношения между конструкторами разных типов. Я не знаю, может ли любой другой трюк GADT удовлетворить ваши требования. Я хотел бы видеть ответ других людей. – objmagic
Имхо - это ключ к построению отношений равенства. В этом конкретном случае '' введите a. a rr -> string -> (the resolve_result_t -> unit) -> unit'' ограничивает '' a'' в '' a rr'' то же самое, что '' a'' в '' resol_result_t''. Затем вы изменяете свое определение типа для '' rr'' и '' resol_result_t'' соответственно. – objmagic