Как систематически вычислять количество жителей данного типа в 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
имеет нулевых жителей.
Реализация алгоритма для первых трех тривиальна, но я не могу понять, как это сделать для других.