用于确定 Nat 在编译时是否可以被 5 整除的函数
Function to Determine if Nat is Divisible by 5 at Compile-Time
使用 Cactus's helpful ,我尝试编写一个函数,给定一个 Nat
,如果它可以被 5
整除,那么 return 将 Nat
。
onlyModBy5Helper : (n : Nat) -> (k : Nat ** k `mod` 5 = 0) -> Nat
onlyModBy5Helper n k = n
然后是主要功能:
onlyModBy5 : Nat
onlyModBy5 = onlyModBy5Helper 10 (10 ** Refl)
但是,由于编译时错误而失败:
When checking right hand side of onlyModBy5 with expected type
Nat
When checking argument pf to constructor Builtins.MkDPair:
Type mismatch between
0 = 0 (Type of Refl)
and
(\k =>
Prelude.Nat.Nat implementation of Prelude.Interfaces.Integral, method mod k
5 =
0) 10 (Expected type)
Specifically:
Type mismatch between
0
and
Prelude.Nat.Nat implementation of Prelude.Interfaces.Integral, method mod 10
5
我做错了什么?
这种情况有点奇怪:Nat
的 Integral
实现是:
partial
Integral Nat where
div = divNat
mod = modNat
如果您在类型签名中使用 modNat
而不是 mod
,它就可以工作。类型统一器仍然存在一些问题。我猜它不会进一步解决,因为它认为实现是部分的而不是全部的。
但是,您的 onlyModBy5Helper
并没有完全达到您想要实现的目标,因为 onlyModBy5Helper 4 (10 ** Refl)
会 return 4
,因为 n
和 k
的依赖对不需要是相同的值。这个函数需要一个 n : Nat
和一个 n
的证明,可能就是你想要的:
onlyModBy5Helper : (n : Nat) -> n `modNat` 5 = 0 -> Nat
onlyModBy5Helper n prf = n
请注意,这类似于依赖对,您可以(但不应该,因为它添加了不必要的抽象),将函数编写为:
onlyModBy5Helper : (n : Nat ** n `modNat` 5 = 0) -> Nat
onlyModBy5Helper pair = fst pair
使用 Cactus's helpful Nat
,如果它可以被 5
整除,那么 return 将 Nat
。
onlyModBy5Helper : (n : Nat) -> (k : Nat ** k `mod` 5 = 0) -> Nat
onlyModBy5Helper n k = n
然后是主要功能:
onlyModBy5 : Nat
onlyModBy5 = onlyModBy5Helper 10 (10 ** Refl)
但是,由于编译时错误而失败:
When checking right hand side of onlyModBy5 with expected type
Nat
When checking argument pf to constructor Builtins.MkDPair:
Type mismatch between
0 = 0 (Type of Refl)
and
(\k =>
Prelude.Nat.Nat implementation of Prelude.Interfaces.Integral, method mod k
5 =
0) 10 (Expected type)
Specifically:
Type mismatch between
0
and
Prelude.Nat.Nat implementation of Prelude.Interfaces.Integral, method mod 10
5
我做错了什么?
这种情况有点奇怪:Nat
的 Integral
实现是:
partial
Integral Nat where
div = divNat
mod = modNat
如果您在类型签名中使用 modNat
而不是 mod
,它就可以工作。类型统一器仍然存在一些问题。我猜它不会进一步解决,因为它认为实现是部分的而不是全部的。
但是,您的 onlyModBy5Helper
并没有完全达到您想要实现的目标,因为 onlyModBy5Helper 4 (10 ** Refl)
会 return 4
,因为 n
和 k
的依赖对不需要是相同的值。这个函数需要一个 n : Nat
和一个 n
的证明,可能就是你想要的:
onlyModBy5Helper : (n : Nat) -> n `modNat` 5 = 0 -> Nat
onlyModBy5Helper n prf = n
请注意,这类似于依赖对,您可以(但不应该,因为它添加了不必要的抽象),将函数编写为:
onlyModBy5Helper : (n : Nat ** n `modNat` 5 = 0) -> Nat
onlyModBy5Helper pair = fst pair