将 Nat 维持在固定范围内

Maintaining a Nat within a fixed range

我想要一个保持在固定范围内的 Nat。我希望 incrdecr 函数在将数字推到范围之外时失败。这似乎是 Fin 的一个很好的用例,但我不太确定如何让它发挥作用。类型签名可能看起来像这样:

- Returns the next value in the ordered finite set.
- Returns Nothing if the input element is the last element in the set. 
incr : Fin n -> Maybe (Fin n)

- Returns the previous value in the ordered finite set.
- Returns Nothing if the input element is the first element in the set.
decr : Fin n -> Maybe (Fin n)

Nat 将用于索引到 Vect n。如何实现 incrdecrFin 是正确的选择吗?

我想最简单的方法是使用来自 Data.Fin:

的一些标准 Fin↔Nat 转换函数
incr, decr : {n : Nat} -> Fin n -> Maybe (Fin n)
incr {n=n} f = natToFin (succ $ finToNat f) n

decr {n=n} f = case finToNat f of
    Z => Nothing
    S k => natToFin k n