【问题标题】:Is functional programming considered more "mathematical"? If so, why?函数式编程是否被认为更“数学”?如果是这样,为什么?
【发布时间】:2011-05-29 16:55:44
【问题描述】:

时不时地,我听到有人说“函数式编程语言更数学”之类的话。是这样吗?如果是这样,为什么以及如何?例如,Scheme 是否比 Java 或 C 更具数学性?还是 Haskell?

我无法准确定义什么是“数学”,但我相信你能体会到。

谢谢!

【问题讨论】:

    标签: oop functional-programming math imperative-languages


    【解决方案1】:

    有两种常见的 (*) models of computationLambda Calculus (LC) 型号和 Turing Machine (TM) 型号。

    Lambda 演算通过使用数学形式来表示计算来处理计算,其中结果是通过类型域上的函数组合产生的。 LC 还与Combinatory Logic 有关,这被认为是针对同一主题的更通用的方法。

    图灵机模型通过将计算表示为使用一组基本操作(如加法、突变等)对存储在理想化存储中的符号进行操作来处理计算。

    这些不同的计算模型是不同系列编程语言的基础。 Lambda 演算产生了MLSchemeHaskell 等语言。图灵模型产生了CC++Pascal等。概括地说,大多数functional programming 语言都有 lambda 演算的理论基础。

    由于 Lambda 演算的性质,某些基于其原理构建的系统行为的证明是可能的。事实上,可证明性(即correctness)是LC 中的一个重要概念,它使关于LC 系统的某些推理和结论成为可能。 LC 也与类型论和范畴论相关(并依赖于)。

    相比之下,图灵模型较少依赖类型理论,而更多地依赖于将计算结构化为底层模型中的一系列状态转换。图灵机计算模型更难做出断言,并且不适合基于 LC 的程序所做的相同类型的数学证明和操作。然而,这并不意味着不可能进行这样的分析——在研究虚拟化和程序的静态分析时会用到 TM 模型的一些重要方面。

    因为函数式编程依赖于仔细选择类型和类型之间的转换,所以 FP 可以被认为更“数学化”。

    (*) 也存在其他计算模型,但它们与本次讨论的相关性较低。

    【讨论】:

    • 重要的是要提到这两个模型是等效的。
    【解决方案2】:

    纯函数式编程语言是functional calculus 的示例,因此理论上用函数式语言编写的程序可以在数学意义上进行推理。理想情况下,您希望能够“证明”程序是正确的。

    在实践中,除了一些琐碎的情况外,这样的推理非常困难,但在某种程度上仍然是可能的。您可能能够证明程序的某些属性,例如,您可能能够证明给定程序的所有数字输入,输出总是被限制在某个范围内。

    在具有可变状态和副作用的非函数式语言中,尝试推理程序并“证明”正确性几乎是不可能的,至少目前是这样。对于非功能性程序,您可以仔细考虑程序并说服自己其中的某些部分是正确的,并且您可以运行单元测试来测试某些输入,但通常不可能构建关于程序行为的严格数学证明。

    【讨论】:

    • 原来如此,证明逻辑的能力直接来源于数学。
    【解决方案3】:

    我认为一个主要原因是纯函数式语言没有副作用,即没有可变状态,它们只是将输入参数映射到结果值,这正是数学函数所做的。

    【讨论】:

      【解决方案4】:

      函数式编程的逻辑结构重于based on lambda calculus。虽然它似乎不是仅基于数学的代数形式的数学,但它写成very easily from discrete mathematics

      与命令式编程相比,它并没有明确规定如何做某事,而是规定必须做什么。这反映了拓扑。

      【讨论】:

      • 我认为这反映了拓扑结构。值得解释一下!
      • 这很公平!拓扑学是对在物体连续变形下保持不变的物体特性的研究。它通常涉及函数映射的空间,而不是函数本身——它对提供这种映射的所有可能的函数都有效。在函数式编程中,映射到和映射的空间是指定的,而不是算法本身。命令式指定算法,您希望它映射到正确的空间。
      【解决方案5】:

      函数式编程语言的数学感觉来自几个不同的特性。最明显的是名字; “函数式”,即使用函数,这是数学的基础。另一个重要的原因是函数式编程涉及定义一组永远为真的事物,通过它们的交互来实现所需的计算——这类似于数学证明的完成方式。

      【讨论】:

        猜你喜欢
        • 2011-12-01
        • 2016-04-22
        • 1970-01-01
        • 2018-09-29
        • 2020-06-09
        • 2020-03-13
        • 2020-07-09
        • 1970-01-01
        • 2011-08-22
        相关资源
        最近更新 更多