Позвольте двум вариантным типам:
type typeA =
| A1
| A2
;;
type typeB =
| B1 of typeA
| B2 of typeA
;;
и функциям проверки типов:
let isA1 = function A1 -> true | _ -> false;;
let isA2 = function A2 -> true | _ -> false;;
let isB1 = function B1 e -> true | _ -> false;;
let isB2 = function B2 e -> true | _ -> false;;
Я хотел бы создать список этих функций для проверки элементов типа A илиB
, поскольку они разных типов, мне нужны полиморфные варианты, и я получаю:
type filterA =
{
handleA : typeA -> bool;
};;
type filterB =
{
handleB : typeB -> bool;
};;
type filterslist = [`FilterA of filterA | `FilterB of filterB] list ;;
let filters1 = [`FilterA { handleA = isA1 }; `FilterB { handleB = isB1 }] ;;
Итак, теперь я хочу перебрать filters1 для проверки типа аргумента, который я пробовал:
let exec_filters filters event = List.iter (fun fil -> match fil with `FilterA -> fil.handleA event; ()| `FilterB -> fil.handleB event; () ) filters;;
но это не оценено:
Error: This expression has type [< `FilterA | `FilterB ]
but an expression was expected of type filterA
Как я могу справиться с этим?