Скажем, у меня есть такой тип данных:
data NumCol = Empty |
Single Int |
Pair Int Int |
Lots [Int]
Теперь я хочу отфильтровать элементы, соответствующие данному конструктору, от [NumCol]
. Я могу написать это, скажем, Pair
:
get_pairs :: [NumCol] -> [NumCol]
get_pairs = filter is_pair
where is_pair (Pair _ _) = True
is_pair _ = False
Это работает, но не является общим. Мне нужно написать отдельную функцию для is_single
, is_lots
и т.д.
Вместо этого я могу написать:
get_pairs = filter (== Pair)
Но это работает только для конструкторов типов, которые не принимают аргументов (т.е. Empty
).
Итак, вопрос в том, как я могу написать функцию, которая принимает значение и конструктор, и возвращает, соответствует ли значение конструктору?