Programming languages “什么是”呢;总功能编程“;?

Programming languages “什么是”呢;总功能编程“;?,programming-languages,functional-programming,Programming Languages,Functional Programming,有这样的说法: 总功能编程(也包括 被称为强函数 编程,与 普通的,还是弱功能的 编程)是一种编程范式 这限制了程序的范围 给那些可以证明的人 终止 及 这些限制意味着 函数式编程并非如此 图灵完成。但是, 可以使用的算法仍在使用中 巨大的。例如,任何算法 有一个渐近上界 它的计算可以是微不足道的 变成 利用 作为额外参数的上限 每次都会递减 迭代或递归 还有一篇关于一篇论文的Lambda-The-Ultimate帖子 直到上周,我才在邮件列表中看到这一点 您还知道其他资源、参考资料或示例实现吗

有这样的说法:

总功能编程(也包括 被称为强函数 编程,与 普通的,还是弱功能的 编程)是一种编程范式 这限制了程序的范围 给那些可以证明的人 终止

这些限制意味着 函数式编程并非如此 图灵完成。但是, 可以使用的算法仍在使用中 巨大的。例如,任何算法 有一个渐近上界 它的计算可以是微不足道的 变成 利用 作为额外参数的上限 每次都会递减 迭代或递归

还有一篇关于一篇论文的Lambda-The-Ultimate帖子

直到上周,我才在邮件列表中看到这一点


您还知道其他资源、参考资料或示例实现吗?

如果我理解正确,总体函数编程就是指:使用总体函数编程。如果我没有记错我的数学课程,一个总函数是一个在其整个域上定义的函数,一个局部函数是一个在其定义中有“洞”的函数

现在,如果你有一个函数,它对于某些输入值
v
进入无限递归或无限循环,或者通常不以其他方式终止,那么你的函数不是为
v
定义的,因此是部分的,即不是全部的

Total Functional Programming不允许您编写这样的函数。所有函数始终返回所有可能输入的结果;而类型检查器确保了这种情况

我的猜测是,这大大简化了错误处理:没有任何错误


你的报价中已经提到了缺点:它不是图灵完整的。操作系统本质上是一个巨大的无限循环。事实上,我们不希望操作系统终止,我们称这种行为为“崩溃”,并对我们的计算机大喊大叫

慈善是另一种保证终止的语言:

休谟是一种有四个层次的语言。外层是图灵完整层,最内层保证终止:

虽然这是一个老问题,但我认为迄今为止没有一个答案提到总体函数式编程的真正动机,即:

如果程序是证明,而证明是程序,那么有“洞”的程序作为证明就没有任何意义,并且引入了逻辑不一致性

基本上,如果证明是一个程序,那么无限循环可以用来证明任何东西。这真的很糟糕,并且为我们为什么想要完全编程提供了很多动机。其他答案往往无法解释论文的另一面。虽然这些语言在技术上不是图灵完备的,但通过使用共归纳定义和函数,您可以恢复许多有趣的程序。我们很容易想到归纳数据,但是codata在这些语言中有一个重要的用途,你可以完全定义一个无限的定义(当进行终止的实际计算时,你可能只会使用其中的有限部分,或者如果你在写操作系统的话,可能不会)


同样值得注意的是,大多数证明助手都是基于这一原则工作的,例如Coq。

我认为在这一点上,这只是一个没有实现的想法。不过我很想被证明是错的。对不起,在写我删除的答案之前,我没有查看LtU的帖子。哈,我从来没有想过那个微不足道的转变。这真是太棒了。@VinkoVrsalovic这是目前在Coq中实现的(在2008年,afaik)。现在,是否使用Coq是另一回事;-)最大的问题是它不允许无限的最小化。我知道有时这些风格也允许程序可以证明永远不会终止,因为那些也可能有用(例如操作系统)。很难处理的函数是那些可能终止的函数,因为你不知道你的程序是否会给你答案(或停止)。我不同意,如果你读了这篇文章和帖子,你可以得到一个“永远运行”的总函数,它只是一个共同定义的函数,而不是一个归纳定义的函数,这正是使用这种编程方法编写操作系统的方式。@KristopherMicinski归纳法是指递归吗?那么共导意味着共草书?这是否意味着一个完整的函数式编程仍然允许通过区分数据和codata来实现非终止性?归纳/递归的区别并没有很好的定义,我区分它们的方式是通过逻辑排序(例如,Coq中的“Set”和“Prop”)。总体函数式编程允许使用codata进行非终止,但只有在codata是有效的(即,任何有限的观察都会产生一些可“查看”的内容)的约束下才允许。这个答案实际上是不正确的。据称无法写入的“函数”不是函数。很可能对于某些输入,特定的算法会提供无限的计算过程。许多总体编程语言允许通过共归纳构造无限进程。操作系统应该是完全共生产的程序:即,始终处于活动状态。一种完整的编程语言可以准确地解释图灵机执行的潜在无限过程:它不能保证它总是有限的,因为它不是。部分语言不擅长承诺。不一致性确实会给逻辑系统带来帮助,但对于程序员来说(这篇文章的标题是“编程”),这并不是世界末日。这只是意味着在对系统进行推理时需要更加小心。如果可以使用非终止项,则不能(必然)将n-n替换为0。(它消除了终止效应,终止效应可能是kos,也可能不是kos