首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >精益编程语言中的循环

精益编程语言中的循环
EN

Stack Overflow用户
提问于 2022-01-26 23:53:42
回答 1查看 274关注 0票数 2

我开始学习Lean编程语言https://leanprover.github.io

我发现有函数、结构、if/ and和其他常见的编程命令。

然而,我还没有找到任何可以处理loops的东西。在精益中有迭代或重复代码块的方法吗?类似于其他语言中的forwhile。如果是这样的话,请添加语法或一个例子。

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-27 00:04:26

与其他函数式编程语言一样,精益中的循环主要是通过递归完成的。例如:

代码语言:javascript
复制
-- lean 3
def numbers : ℕ → list ℕ
| 0 := []
| (n+1) := n :: numbers n

如果你不习惯的话,这是一种心态的改变。请参阅:C公司的Haskell : for Loops在哪里?

更复杂的是,精益区分了一般递归和结构递归。上面的例子是在上使用结构递归,所以我们知道它总是停止。不停止程序会导致基于DTT的定理验证器(如lean )的不一致性,因此必须严格控制。您可以使用meta关键字选择一般递归:

代码语言:javascript
复制
-- lean 3
meta def foo : ℕ → ℕ
| n := if n = 100 then 0 else foo (n + 1) + 1

在精益4中,do块语法包括一个for命令,该命令可以用来以更命令式的方式为循环编写。请注意,它们仍然被表示为幕后的尾递归函数,并且有一些类型类型为去标记提供了动力。(在精益4中,您还需要使用partial关键字而不是meta来执行一般递归。)

代码语言:javascript
复制
-- lean 4
partial def foo (n : Nat) : Nat :=
  if n = 100 then 0 else foo (n + 1) + 1

def mySum (n : Nat) : Nat := Id.run do
  let mut acc := 0
  for i in [0:n] do
    acc := acc + i
  pure acc
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70871694

复制
相关文章

相似问题

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