Xash在Function to Determine if Nat is Divisible by 5 at Compile-Time(我从原来的长名称重新命名)中为我提供了一个有用的答案:
onlyModBy5 : (n : Nat) -> n `modNat` 5 = 0 -> Nat
onlyModBy5 n prf = n
以前的answer教育我如何使用Refl
参数在REPL上运行它:
-- 5 % 5 == 0, so it should compile
*Test> onlyModBy5 5 Refl
5 : Nat
-- 7 % 5 == 2, so it should not compile
*Test> onlyModBy5 7 Refl
(input):1:12:When checking an application of function Main.onlyModBy5:
Type mismatch between
x = x (Type of Refl)
and
modNat 7 5 = 0 (Expected type)
Specifically:
Type mismatch between
2
and
0
然后,我尝试定义一个辅助函数,它将为简洁性提供第二个prf
(校对)参数。换句话说,我更喜欢这个函数的调用者不必提供Refl
参数。
onlyModBy5Short : (n : Nat) -> Nat
onlyModBy5Short n = onlyModBy5 n Refl
但是,它没有编译:
When checking right hand side of onlyModBy5Short with expected type
Nat
When checking an application of function Main.onlyModBy5:
Type mismatch between
0 = 0 (Type of Refl)
and
modNat n 5 = 0 (Expected type)
Specifically:
Type mismatch between
0
and
Prelude.Nat.modNatNZ, mod' n 4 SIsNotZ n n 4
Holes: Main.onlyModBy5Short
如果可能,如何编写此函数?
答案 0 :(得分:2)
您可以将GetPixel()
的第二个参数设为auto
argument:
onlyModBy5
这是有效的,因为对于onlyModBy5 : (n : Nat) -> {auto prf : n `modNat` 5 = 0} -> Nat
onlyModBy5 n = n
的给定字面值,n
总是可以减少,因此n `modNat` 5
总是会减少到n `modNat` 5 = 0
(在这种情况下构造函数) 0 = 0
具有正确的类型),除非Refl
真的不能被5整除。
确实,这将允许你进行类型检查
n
但拒绝
foo : Nat
foo = onlyModBy5 25