首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数来确定Nat `Nat‘5 == 0

函数来确定Nat `Nat‘5 == 0
EN

Stack Overflow用户
提问于 2016-04-11 02:46:42
回答 1查看 107关注 0票数 1

XashFunction to Determine if Nat is Divisible by 5 at Compile-Time上给了我一个有用的答案(我从我原来的长名字中重新命名):

代码语言:javascript
复制
onlyModBy5 : (n : Nat) -> n `modNat` 5 = 0 -> Nat
onlyModBy5 n prf = n

以前的一个answer教我如何使用Refl参数在REPL上运行它:

代码语言:javascript
复制
-- 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参数。

代码语言:javascript
复制
onlyModBy5Short : (n : Nat) -> Nat
onlyModBy5Short n = onlyModBy5 n Refl

但是,它没有编译:

代码语言:javascript
复制
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

如果可能的话,如何编写这个函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-11 02:59:15

你可以把onlyModBy5的第二个论点变成 argument

代码语言:javascript
复制
onlyModBy5 : (n : Nat) -> {auto prf : n `modNat` 5 = 0} -> Nat
onlyModBy5 n = n

这是因为对于给定的n文本值,n `modNat` 5总是可以减少,所以n `modNat` 5 = 0总是会减少到0 = 0 (在这种情况下,构造函数Refl具有正确的类型),除非n确实不能被5整除。

实际上,这将允许您对打字机进行检查。

代码语言:javascript
复制
foo : Nat
foo = onlyModBy5 25

但拒绝

代码语言:javascript
复制
bar : Nat
bar = onlyModBy5 4
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36539019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档