辅助函数确定Nat`mod` 5 == 0

时间:2016-04-11 02:46:42

标签: idris

XashFunction 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

如果可能,如何编写此函数?

1 个答案:

答案 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