В этом ответе Габриэль Гонсалес показывает, как показать, что 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
, я уверен, что других функций этого типа нет.
Я не думаю, что трюк Габриэля немедленно применим здесь, каким бы способом я ни выбрал типы. Существуют ли другие подходы (одинаково формальные!), С которыми я могу показать изоморфизм между этим типом и ()
?