В моем проекте я создал тип данных, который может содержать один из нескольких типов значений:
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
, у меня есть достаточно Monads в остальной части моего кода, поскольку это:)