Что касается вашей ошибки типа, проблема выглядит как первое предложение для меня:
isMember Phi _ = True
Это странное предложение для записи, потому что Phi
- это целый набор, а не элемент набора.Простое удаление должно дать вам функцию ожидаемого вами типа.
Обратите внимание, что ваш тип Set
никогда не использует свой аргумент второго типа, поэтому он может быть записан вместо этого как
data Set a = Phi | Cons a (Set a)
... и в этот момент вы должны просто использовать [a]
, поскольку он изоморфен и имеет огромный набор функций, уже написанных для использования и злоупотребления ими.
Наконец, вы просите иметь возможность поставитьвещи разных типов. Короткий ответ: Хаскелл на самом деле так не колеблется.Все дело в том, чтобы точно знать, что это за тип во время компиляции , что на самом деле не совместимо с тем, что вы предлагаете.На самом деле есть несколько способов сделать это;тем не менее, я настоятельно рекомендую познакомиться с особой маркой бондажа Хаскелла, прежде чем пытаться снять облигации.