代码之家  ›  专栏  ›  技术社区  ›  Alon Gubkin

数学中的函数和编程中的函数有什么区别?

  •  22
  • Alon Gubkin  · 技术社区  · 14 年前

    数学中的函数和编程中的函数有什么区别?

    6 回复  |  直到 14 年前
        1
  •  24
  •   Marco    5 年前

    在函数式编程中 Referential Transparency ,这意味着您可以用函数值替换函数,而无需更改程序。 是的 在数学上也是,但是 这是 不一定是真的 用命令式语言。

    A 定义为:将元素从一个集合(a)映射到另一个集合(B)的关系,将第一个集合中的每个元素只映射到另一个集合中的一个。

    主要的区别是 如果你打电话 f(x) 在数学方面,你会得到相同的答案,但如果你打电话 f'(x) 在C中,答案可能不一样(对于相同的参数,不会得到相同的输出)。。如果有两台机器处于相同的状态,它们将输出相同的。。但它试图说明的是,非函数式语言中的函数可能不完全依赖于您给出的参数,而是依赖于程序的其他内容)

    math和C函数的另一个区别是,在math中,不能使函数从非空集变为空集(在C中,这是:不要求总是用函数返回某些东西)。而且,并非所有函数都是 computable uncountable 集合(如f:R->R)(在C中有浮点数,但它们只表示实数的缩减集合,这是有限的)。

    总结 :

        2
  •  6
  •   San Jacinto    14 年前

    这取决于领域(我不是指功能领域,我是指学习领域),也可能取决于语言。

    int giveRandAtmosWithMul(int mult)
    {
        return mult * rand();
    }
    

    正如你所看到的,如果没有一些人人都同意的标准协议,这些差异实际上是不可客观定义的。

        3
  •  3
  •   houbysoft    14 年前

    我认为最重要的区别是数学中的函数(和函数编程)不能改变状态,而(命令式)编程函数可以。

        4
  •  2
  •   Community CDub    8 年前

    其他答案是正确的-这是两个不同的事情。相反,我会证明他们是有关联的。我将用 -> ,数学函数 => .

    假设您有一种支持异常的语言。在这种情况下,可以考虑一个编程函数 A -> B 作为一个数学函数 A => B + E 其中“B+E”表示 B ,或者类似的东西 E . 您的语言有两个从函数返回的关键字,“return”和“throw”。

    f: A -> B g: B -> C g(f(x)) f(x) 引发异常, g g(1/0) . 语言会处理这个问题,你不需要检查 f 是个例外。从数学上描述这一点的方法是 f: A => B+E g: B => C+E B+E => C+E . 现在是一个可能接受异常的函数,但它只会传播它。

    g': B+E => C+E 通过

            /   g(x)   if x ∈ B
    g'(x)= |
            \   x      if x ∈ E
    

    有两个功能的 g':B+E=>C+E 你可以在数学意义上安全地合成它们。这是什么 g(f(x)) g' 第一。

    想想不确定性。如果你有一个函数 这是不确定的,那么你可以用数学的方法来描述它,说这是一个函数 A => Set(B) 哪里 Set(B) 是一组可能的结果。例如,如果 f(1) 可能会给你1,2或3,然后在数学上 f(1) = {1,2,3} 尽管在编程时被要求 你只能得到其中一个号码。现在你可以组成不确定函数了 A->B B->C g(f(x)) . 结果将是 C ,但这将是不确定的。在数学上,组合函数 B => Set(C) 给你 A => Set(C) 只取 ,必须将其提升到不确定值 g': Set(B) => Set(C) g'({1,2}) 是集合的并集 g(1) g(2) . 所以呢 g(f(x)) 意味着你要逃跑 f ,获取所有可能的结果集并运行 在他们每个人身上。有两层不确定性,但它们被“扁平化”为一层。

    与全局状态相同。如果你把每个全局变量作为一个函数和结果的参数,你可以认为没有全局变量,每个函数都接受所有全局状态,语言在编写时必须交出状态。函数 读写状态 S 是一个函数 (A,S) => (B,S) ,也可以写成 A => (S => (B,S)) . 正式地写这个更复杂,但它是相同的模式。

    输入/输出也可以这样做,我在另一篇文章中描述了这一点 SO answer .

    组成“有效”功能的“魔力”是:

    • 使类型有效的方法。例如,转弯 进入之内 B+E 设置(B) . 我将表示类型的有效版本 X 作为 F(X)
    • 提升功能的方法: B -> F(C) 进入之内 F(B) -> F(C) . 它允许组合函数 A -> F(B) B->F(C)
    • 关键字 return 必须转换为普通值 A 进入之内 A+E ,或单例 Set(A) X -> F(X) .

    throw 不确定性的monad fork ,州单子 get/put read/write 等。

    命令式编程中的函数实际上是数学函数 ,但具有非常奇怪的结果类型,这些结果类型也描述了特殊效果。这是Haskell等纯函数式语言所采用的方法。

        5
  •  1
  •   user334911 user334911    14 年前

    计算机科学中的函数是一段代码,它接受输入,做某事,并可能返回输出,但它可以在两者之间做很多事情。它可以获取网页,发送电子邮件,播放视频,等等。

        6
  •  1
  •   Pankaj    10 年前

    数学函数本质上是陈述式的,即它们总是有“是什么”的描述,而计算机科学中的函数是必需的,即它们有“如何”的描述。

    参考:计算机程序的结构和解释。