Как могут работать конечные числа? (зависимые типы)

Я заинтересован в типизированных языках. Конечные числа кажутся мне очень полезными. Например, для безопасного индексирования массивов фиксированного размера. Но определение мне не понятно.

Тип данных для конечных чисел в Идрисе может быть следующим: (И, вероятно, аналогичным в Агде)

data FiniteNum : Natural -> Type where
  FZero : FiniteNum (Succ k)
  FSucc : FiniteNum k -> FiniteNum (Succ k)

И это похоже на работу:

exampleFN : FiniteNum (Succ (Succ Zero))
exampleFN = FSucc FZero -- typechecks
-- exampleFN = FSucc (FSucc FZero)  -- won't typecheck

Но как это работает? Что значит k? И как получилось, что средство проверки типов принимает первую реализацию и отклоняет вторую?

Ответы на вопрос(2)

Ваш ответ на вопрос