Итак, я понимаю основную алгебраическую интерпретацию типов:
Either a b ~ a + b
(a, b) ~ a * b
a -> b ~ b^a
() ~ 1
Void ~ 0 -- from Data.Void
... и что эти отношения верны для конкретных типов, таких как Bool
, в отличие от полиморфных типов типа a
. Я также знаю, как переводить сигнатуры типов с полиморфными типами в их конкретные представления типов, просто переведя кодировку Церкви в соответствии со следующим изоморфизмом:
(forall r . (a -> r) -> r) ~ a
Итак, если у меня есть:
id :: forall a . a -> a
Я знаю, что это не означает id ~ a^a
, но это на самом деле означает:
id :: forall a . (() -> a) -> a
id ~ ()
~ 1
Аналогично:
pair :: forall r . (a -> b -> r) -> r
pair ~ ((a, b) -> r) - > r
~ (a, b)
~ a * b
Это подводит меня к моему вопросу. Что такое "алгебраическая" интерпретация этого правила:
(forall r . (a -> r) -> r) ~ a
Для каждого конкретного изоморфизма типа я могу указать эквивалентное алгебраическое правило, такое как:
(a, (b, c)) ~ ((a, b), c)
a * (b * c) = (a * b) * c
a -> (b -> c) ~ (a, b) -> c
(c^b)^a = c^(b * a)
Но я не понимаю алгебраическое равенство, аналогичное:
(forall r . (a -> r) -> r) ~ a