В этом ответе Габриэль Гонсалес показывает, как показать, что id является единственным жителем forall a. a -> a. Для этого (в самой формальной итерации доказательства) он показывает, что тип изоморфен (), используя лемму Yoneda, и поскольку () имеет в нем только одно значение, то должен быть тип id. Подводя итог, его доказательство таково:
Йонеда говорит:
Functor f => (forall b . (a -> b) -> f b) ~ f aЕсли
a = ()иf = Identity, это становится:(forall b. (() -> b) -> b) ~ ()И поскольку тривиально
() -> b ~ b, LHS является в основном типомid.
Это похоже на "волшебный трюк", который хорошо работает для id. Я пытаюсь сделать то же самое для более сложного типа функции:
(b -> a) -> (a -> b -> c) -> b -> c
но я не знаю, с чего начать. Я знаю, что он заселен \f g x = g (f x) x, и если вы игнорируете уродливые вещи ⊥/undefined, я уверен, что других функций этого типа нет.
Я не думаю, что трюк Габриэля немедленно применим здесь, каким бы способом я ни выбрал типы. Существуют ли другие подходы (одинаково формальные!), С которыми я могу показать изоморфизм между этим типом и ()?