Wikipedia有这样的说法:
全功能编程(也是 被称为强大功能 编程,与之形成鲜明对比 普通的,或弱的功能 编程)是一种编程范式 这限制了程序的范围 那些可证明的 终止。
和
这些限制意味着总数 功能编程不是 图灵完备。但是,这套 可以使用的算法仍然是 巨大。例如,任何算法 有一个渐近上界 为它计算可以是微不足道的 变成了一个 通过使用可证明终止功能 上限作为额外参数 每个都递减 迭代或递归。
还有一篇关于Total Functional Programming的论文的Lambda The Ultimate Post。
直到上周,我还没有在邮件列表上看到过。
您知道更多资源,参考或任何示例实现吗?
答案 0 :(得分:24)
如果我理解正确的话,全功能编程就意味着:用全部函数编程。如果我正确记住我的数学课程,则总函数是在整个域中定义的函数,部分函数是在其定义中具有“漏洞”的函数。
现在,如果你有一个函数,对于某些输入值v
进入无限递归或无限循环或者通常不以其他方式终止,那么你的函数没有为{定义{1}},因此是部分的,即不是全部的。
Total Functional Programming不允许您编写这样的函数。所有功能始终返回所有可能输入的结果;并且类型检查器确保这种情况。
我的猜测是,这大大简化了错误处理:没有。
你的引言中已经提到了缺点:它不是图灵完整的。例如。操作系统本质上是一个巨大的无限循环。实际上,我们并不希望操作系统终止,我们称这种行为为“崩溃”并对我们的计算机大吼大叫!
答案 1 :(得分:10)
虽然这是一个老问题,但我认为到目前为止,没有一个答案能提到全部函数式编程的真正动机,这就是:
如果程序是证明,而证明是程序,那么具有“漏洞”的程序就没有任何意义作为证据,并引入逻辑上的不一致。
基本上,如果证明是程序,则可以使用无限循环来证明任何。这真的很糟糕,并提供了我们为什么要完全编程的动机。其他答案往往不考虑论文的另一面。虽然语言 techincally 没有完整,但您可以通过使用共感应定义和函数来恢复许多有趣的程序。我们很容易想到归纳数据,但 codata 在这些语言中起着重要的作用,在这些语言中你可以完全定义一个无限的定义(当做真实的时候)如果您正在编写操作系统,那么终止的计算,您可能只会使用其中的一部分,或者可能不会。)
值得注意的是,大多数证据助理都是基于这个原则工作的,例如Coq。
答案 2 :(得分:9)
慈善是另一种保证终止的语言:
http://pll.cpsc.ucalgary.ca/charity1/www/home.html
休谟是一种4级语言。外层是图灵完成,最内层保证终止:
http://www-fp.cs.st-andrews.ac.uk/hume/report/