以下函数编译:
onlyModByFive : (n : Nat) -> (k : Nat ** 5 * k = n) -> Nat
onlyModByFive n k = 100
但k
用Nat ** 5 * k = n
语法表示什么?
另外,我怎么称呼它?这是我尝试过的,但我不理解输出。
*Test> onlyModByFive 5 5
When checking an application of function Main.onlyModByFive:
(k : Nat ** plus k (plus k (plus k (plus k (plus k 0)))) = 5) is not a
numeric type
答案来源 - https://groups.google.com/d/msg/idris-lang/ZPi9wCd95FY/eo3tRijGAAAJ
答案 0 :(得分:5)
(k : Nat) ** (5 * k = n)
是由
k : Nat
prf : 5 * k = n
换句话说,这是一种存在主义类型,表示存在k : Nat
,5 * k = n
"。为了具有建设性,你必须提供一个k
并证明它确实满足5 * k = n
。
在您的示例中,如果您将onlyModByFive
部分应用于5
,则会获得某种类型的内容
onlyModModByFive 5 : ((k : Nat) ** (5 * k = 5)) -> Nat
所以第二个参数必须是(k : Nat) ** (5 * k = 5)
类型。通过将k
设置为1
并证明5 * 1 = 5
:
foo : Nat
foo = onlyModByFive 5 (1 ** Refl)
。
5 * 1
这可行,因为5
缩减为5 = 5
,因此我们必须证明Refl : a = a
,这可以通过直接使用a ~ 5
来简单地完成(统一{{1}} )。