0

在写这个答案时,我注意到虽然这可以按预期工作:

onlyModBy5 : (n : Nat) -> {auto prf : n `modNat` 5 = 0} -> Nat
onlyModBy5 n = n

foo : Nat
foo = onlyModBy5 25

但是一旦我给该属性起一个名字,它就会停止工作:

Divides : Nat -> Nat -> Type
Divides n k = k `modNat` n = 0

onlyModBy5 : (n : Nat) -> {auto prf : 5 `Divides` n} -> Nat
onlyModBy5 n = n

foo : Nat
foo = onlyModBy5 25

现在填充autoarg 失败

Can't find a value of type 
        Divides 5 25

为什么伊德里斯看不透Divides的定义?

4

1 回答 1

1

我不确定这是否是原因,但 modNat 并不完全。这将是绊倒 idris 的一个很好的理由。

divides : Nat -> Nat -> Nat
divides n k = n `modNat` k

onlyModBy5 : (n : Nat) -> {auto prf : n `divides` 5  = 0 } -> Nat
onlyModBy5 n = n

foo : Nat
foo = onlyModBy5 25

由于某种原因,这也已经失败了(只是从原始版本间接一次)。

于 2016-04-11T15:19:41.533 回答