Има ли добър начин за кратко разгръщане на алгебричен тип данни в OCaml? Например, разгледайте следния код, който дефинира два различни типа математически функции
type ftype =
| Quadratic of {alpha : float; a : float array; aa : float array}
| General of {eval : float array->float}
type myfn = {
nvar : int;
typ : ftype}
let f = {
nvar = 2;
typ = General {eval = fun x-> x.(0) +. x.(1)}}
За целите на отстраняването на грешки понякога е хубаво просто да оцените функция или да проверите нейните стойности в най-високото ниво. Въпреки това, ако искаме да оценим f, се нуждаем от код, който изглежда като
let x = [| 1.; 2. |]
let y = match f.typ with General(f) -> f.eval(x)
Това е някак грозно и е болезнено за писане, особено ако наслояването е дълбоко няколко слоя. Бих искал да дефинирам някакъв синтаксис като
let y = f.typ.General.eval(x)
И, да, кодът не е безопасен и това няма да се компилира. Въпреки това, нещо близко до това би било хубаво за целите на отстраняване на грешки, така че да не се налага да пишем дълъг код, за да разопаковаме стойност. Има ли добър начин да се постигне това?
let y = let { typ = General(f) } = f in f.eval(x)
. Вероятно по-малко грозен, но със сигурност не по-къс в този случай. Въпреки това ще се справи по-добре с гнезденето. - person glennsl   schedule 17.08.2018