标准库中的natToFin
函数具有以下签名:
natToFin : Nat -> (n : Nat) -> Maybe (Fin n)
natToFin 4 5
会返回Just (FS (FS (FS (FS FZ)))) : Maybe (Fin 5)
natToFin 5 5
会返回Nothing
。
我想要一个带有以下签名的函数:
myNatToFin : (m : Nat) -> (n : Nat) -> { auto p : n `GT` m } -> Fin n
它的行为与标准的lib函数相同,但不需要返回Maybe
,因为Fin n
总是可以从m
生成n
m
}大于myNatToFin
。
如何实施AVG()
?
答案 0 :(得分:5)
您可以通过同时递归m
,n
和n `GT` m
的证据来直接执行此操作:
import Data.Fin
myNatToFin : (m : Nat) -> (n : Nat) -> {auto p : n `GT` m} -> Fin n
myNatToFin Z (S n) = FZ
myNatToFin (S m) (S n) {p = LTESucc _} = FS $ myNatToFin m n
请注意,在第二种情况下,您需要在p
上进行模式匹配(即使它的值未在右侧使用),以便可以填充递归调用的自动参数。 / p>