Чтобы доказать это, просто начните с одной стороны уравнения и переписывайте, пока не дойдете до другой стороны. Мне нравится начинать с более сложной стороны.
when x :: Int,
Continuant (getUI (Continuant x))
-- ^^^^^^^^^^^^^^^^^^^^
-- by definition of getUI in Category Continuant Int
= Continuant x
Это было легко! Это считается доказательством (обратите внимание, формально не проверено - Haskell не достаточно силен, чтобы выразить доказательства на уровне терминов. Но это настолько тривиально, что в Агде не стоит эталона).
Я был немного озадачен формулировкой этой аксиомы, так как она, кажется, довольно часто смешивает типы и термины. Пролистывая статью, кажется, что она предназначена только для простого однократного конструктора newtype
s, поэтому это смешивание оправдано (все еще странно). В любом случае, похоже, что у бумаги нет класса Category
, параметризованного на a
: то есть вместо
class Category t a where ...
это будет
class Category t where ...
, что для меня имеет больше смысла, так как класс описывает полиморфные обертки, а не, возможно, другое описание того, как он обертывает каждый отдельный тип (особенно, если учесть, что аксиома требует, чтобы реализация была одинаковой независимо от того, что a
Вы выбираете!).