Haskell -сравнение простого конструктора (?)функция

В моем проекте я создал тип данных, который может содержать один из нескольких типов значений:

data PhpValue = VoidValue | IntValue Integer | BoolValue Bool

Что я хотел сделать сейчас, состоит в том, чтобы иметь простой способ проверить, относятся ли два значения типа PhpValueк одному и тому же конструктору (исправьте меня, если я запутался с терминологией здесь, но в основном то, что я хочу проверить, если оба, для Например, это IntValue, не заботясь о конкретном значении ).

Вот функция, которую я написал для этого:

sameConstructor :: PhpValue -> PhpValue -> Bool
sameConstructor VoidValue VoidValue = True
sameConstructor (IntValue _) (IntValue _) = True
sameConstructor (BoolValue _) (BoolValue _) = True
sameConstructor _ _ = False

Это работает как надо, но мне это не очень нравится:если я добавлю больше конструкторов, (например,FloatValue Float)мне придется переписать функция, и она будет увеличиваться по мере увеличения моего определения данных.

Вопрос:Можно ли написать такую ​​функцию, чтобы ее реализация не менялась при добавлении дополнительных конструкторов?

Для справки:Я не хочу менять определение data, у меня и так достаточно монад в остальной части моего кода;)

21
задан nietaki 11 April 2012 в 19:57
поделиться