Как систематически вычислять количество жителей данного типа в System F?
Предполагая следующие ограничения:
- Все жители заканчиваются, т.е. нет дна.
- У всех жителей нет побочных эффектов.
Например (используя синтаксис Haskell):
-
Boolимеет двух жителей. -
(Bool, Bool)имеет четыре человека. -
Bool -> (Bool, Bool)имеет шестнадцать жителей. -
forall a. a -> aимеет одного жителя. -
forall a. (a, a) -> (a, a)имеет четыре человека. -
forall a b. a -> b -> aимеет одного жителя. -
forall a. aимеет нулевых жителей.
Реализация алгоритма для первых трех тривиальна, но я не могу понять, как это сделать для других.