Это называется параметричность (parametricity). Ссылки:
J. C. Reynolds "Types, Abstractions and Parametric Polymorphism",
P. Wadler "Theorems for free!".
Первое утверждение можно доказать неким косвенным образом, сославшись на теорему
![$$(\forall f:\forall \alpha.\alpha\to\alpha) (\forall \alpha)(\forall \beta) (\forall g:\alpha\to\beta) (f_\beta\circ g = g \circ f_\alpha),$$ $$(\forall f:\forall \alpha.\alpha\to\alpha) (\forall \alpha)(\forall \beta) (\forall g:\alpha\to\beta) (f_\beta\circ g = g \circ f_\alpha),$$](https://dxdy-04.korotkov.co.uk/f/f/a/e/faee2928bf1b074e3c84d4950b2e8eef82.png)
Аналогично этой теореме, есть свободная теорема для
![$\forall \alpha. \alpha \to \alpha \to \alpha$ $\forall \alpha. \alpha \to \alpha \to \alpha$](https://dxdy-04.korotkov.co.uk/f/f/0/2/f02e6e13b32f7a7b9423330e927bdc4b82.png)
:
![$$(\forall f:\forall \alpha.\alpha\to\alpha\to\alpha) (\forall \alpha) (\forall \beta) (\forall g\colon\alpha\to\beta) (\forall x, y \colon\alpha) (f_{\beta} (g x) (g y) = g (f_{\alpha} x y)).$$ $$(\forall f:\forall \alpha.\alpha\to\alpha\to\alpha) (\forall \alpha) (\forall \beta) (\forall g\colon\alpha\to\beta) (\forall x, y \colon\alpha) (f_{\beta} (g x) (g y) = g (f_{\alpha} x y)).$$](https://dxdy-02.korotkov.co.uk/f/1/9/6/196b97dd2be110936c886de0fe474edc82.png)
Для того, чтобы вывести отсюда существование ровно двух функций, возьмем сначала
![$g = \operatorname{const} u$ $g = \operatorname{const} u$](https://dxdy-02.korotkov.co.uk/f/9/8/d/98d37a66291dbf03b0b84b1500b1c2d982.png)
, получим
![$f u u = u$ $f u u = u$](https://dxdy-01.korotkov.co.uk/f/0/b/7/0b78e7b2035f59f562d82446b876f4bb82.png)
, а потом
![$\alpha = \mathbf{2}$ $\alpha = \mathbf{2}$](https://dxdy-02.korotkov.co.uk/f/d/d/9/dd91b7c6a07557160e4ae9d62299ba8d82.png)
. Есть два варианта функции
![$f_{\mathbf{2}}$ $f_{\mathbf{2}}$](https://dxdy-04.korotkov.co.uk/f/b/0/9/b09911ef72794b49cdbd722af1820d1b82.png)
и с помощью произвольной
![$g$ $g$](https://dxdy-04.korotkov.co.uk/f/3/c/f/3cf4fbd05970446973fc3d9fa3fe3c4182.png)
они распространяются на два варианта полиморфной функции
![$f$ $f$](https://dxdy-02.korotkov.co.uk/f/1/9/0/190083ef7a1625fbc75f243cffb9c96d82.png)
.
Кроме этого, пусть система типов содержит в себе тип списка и соответствующие иму операции композиции/декомпозиции и свёртки. Можно ли как-то доказать, что любая функция с типом
![$\forall \alpha.[\alpha]\to\alpha$ $\forall \alpha.[\alpha]\to\alpha$](https://dxdy-04.korotkov.co.uk/f/b/b/7/bb788ce0ca9bec934f2811f40c7cfca282.png)
представима в виде
![$\lambda l.El(n(\mathrm{length}\, l))$ $\lambda l.El(n(\mathrm{length}\, l))$](https://dxdy-03.korotkov.co.uk/f/e/7/e/e7e92cad5da8eb62b37f7d8dff7062a682.png)
, где
![$Elm$ $Elm$](https://dxdy-04.korotkov.co.uk/f/7/7/8/778af3104f9a5e21ec9ec230d458211d82.png)
возвращает
![$m$ $m$](https://dxdy-01.korotkov.co.uk/f/0/e/5/0e51a2dede42189d77627c4d742822c382.png)
-й элемент списка
![$l$ $l$](https://dxdy-03.korotkov.co.uk/f/2/f/2/2f2322dff5bde89c37bcae4116fe20a882.png)
, для некоторой функции
![$n:\mathbb{N}\to\mathbb{N}$ $n:\mathbb{N}\to\mathbb{N}$](https://dxdy-03.korotkov.co.uk/f/6/2/0/620f0a7b79e70f6589d7c74c965baa4882.png)
?
Тут нужен тип непустого списка, иначе неоткуда брать значение на пустом аргументе (обратите внимание на
![$[\mathbf{0}] \to \mathbf{0}$ $[\mathbf{0}] \to \mathbf{0}$](https://dxdy-02.korotkov.co.uk/f/9/9/7/99786825fe1c40893679a7b481a086d982.png)
). Если рассматривать непустые списки, то можно свести случай к предыдущему: по функции
![$f \colon \forall \alpha. \alpha^{+} \to \alpha$ $f \colon \forall \alpha. \alpha^{+} \to \alpha$](https://dxdy-04.korotkov.co.uk/f/b/9/9/b9982d5b0948dcac3f672b7d6fe3668382.png)
можно определить функции
![$f_{n, i} x y = f [x, \dots, x, y, x, \dots, x]$ $f_{n, i} x y = f [x, \dots, x, y, x, \dots, x]$](https://dxdy-03.korotkov.co.uk/f/a/3/e/a3e185929973886c9de72d8e5c28aaba82.png)
(всего
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
элементов в списке, на
![$i$ $i$](https://dxdy-04.korotkov.co.uk/f/7/7/a/77a3b857d53fb44e33b53e4c8b68351a82.png)
-м месте
![$y$ $y$](https://dxdy-02.korotkov.co.uk/f/d/e/c/deceeaf6940a8c7a5a02373728002b0f82.png)
). Рассматривая их на типе
![$\mathbf{2}$ $\mathbf{2}$](https://dxdy-04.korotkov.co.uk/f/b/5/7/b57c61362876d45b79d251ef55cf336082.png)
, можно доказать, что ровно для одного
![$i$ $i$](https://dxdy-04.korotkov.co.uk/f/7/7/a/77a3b857d53fb44e33b53e4c8b68351a82.png)
это будет
![$\operatorname{snd}$ $\operatorname{snd}$](https://dxdy-03.korotkov.co.uk/f/e/9/b/e9b874abd5dc48d39e81565024e48a8382.png)
.