将 Nat 维持在固定范围内
Maintaining a Nat within a fixed range
我想要一个保持在固定范围内的 Nat
。我希望 incr
和 decr
函数在将数字推到范围之外时失败。这似乎是 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
。如何实现 incr
和 decr
? Fin
是正确的选择吗?
我想最简单的方法是使用来自 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
我想要一个保持在固定范围内的 Nat
。我希望 incr
和 decr
函数在将数字推到范围之外时失败。这似乎是 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
。如何实现 incr
和 decr
? Fin
是正确的选择吗?
我想最简单的方法是使用来自 Data.Fin
:
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