Ну, вы не можете сообщить компилятору, что в списке будет существовать только подтип ... но вы можете явно создать список только с этим подтипом. Фактически, вы ищете List.find_map
, который находит первый элемент, соответствующий определенным критериям, и отображает его (вы используете это отображение для проецирования из my_sum
в его регистр type_a
). Ниже приведен полностью рабочий код (компилируется самостоятельно):
type type_a = {fld_a : string}
type type_b = {fld_b : int}
type my_sum = {a : type_a} / {b : type_b}
mylist = [{a = {fld_a = "test"}}, {b = {fld_b = 10}}] : list(my_sum)
get_first_a(l : list(my_sum)) : option(type_a) =
List.find_map(
(el -> match el
| ~{a} -> some(a)
| _ -> none
), l)
_ = prerr("First a-typed element of {mylist} is {get_first_a(mylist)}\n")
Если бы в stdlib не было функции List.find_map
, все равно было бы множество способов сделать это. Вероятно, самым простым было бы использовать List.filter_map
для получения list(type_a)
, а затем получить его голову с List.head_opt
.