我对依赖类型的语言感兴趣。有限数字对我来说似乎非常有用。例如,安全地索引固定大小的数组。但是这个定义对我来说不是很清楚。
Idris 中有限数的数据类型如下:(在 Agda 中可能类似)
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 是什么意思?为什么类型检查器接受第一个实现而拒绝第二个实现?