scala-计算机上的“原因”一词是什么意思?

在学习函数式编程时,我经常碰到“原因”一词,尤其是在纯函数和/或引用透明性的情况下。 有人可以解释这到底是什么意思吗?

user2456976 asked 2020-02-17T09:30:02Z
6个解决方案
45 votes

通常,在编写程序时,您的工作并不只是编写代码而已,而是您还想知道代码所展现的一些属性。 您可以通过两种方法获得这些属性:通过逻辑分析或通过经验观察。

此类属性的示例包括:

  • 正确性(程序执行了应做的工作)
  • 性能(需要多长时间)
  • 可扩展性(输入如何影响性能)
  • 安全性(算法是否可能被恶意滥用)

当凭经验测量这些属性时,您获得的结果精度有限。 因此,从数学上证明这些属性要优越得多,但是并不总是那么容易做到。 函数式语言通常以使它们的属性的数学证明更易于处理为设计目标之一。 这就是程序推理的典型含义。


就功能或较小单元而言,上述内容适用,但有时作者只是简单地考虑算法或设计算法。 这取决于特定的用法。


顺便说一句,一些例子说明了人们可能如何对其中一些事情进行推理,以及如何进行实证观察:

正确性:如果我们可以方程式地证明它能够执行应做的工作,则可以证明代码是正确的。 因此,对于排序函数,如果我们可以证明给出的任何列表都具有被排序的属性,那么我们知道我们的代码是正确的。 根据经验,我们可以创建一个单元测试套件,在其中提供代码示例的输入并检查代码是否具有所需的输出。

性能和可伸缩性:我们可以分析代码并证明算法的性能范围,以便我们了解所需的时间如何取决于输入的大小。 根据经验,我们可以对我们的代码进行基准测试,并查看它在特定计算机上实际运行的速度。 我们可以执行负载测试,并查看我们的机器/算法在折叠/变得不切实际之前可以接受多少实际输入。

Jakub Hampl answered 2020-02-17T09:31:09Z
23 votes

从最广义上讲,对代码进行推理意味着思考代码及其实际功能(而不是您认为应该做什么)。这意味着

  • 意识到当您向其抛出数据时代码的行为方式,
  • 知道可以重构哪些东西而又不会破坏它,以及
  • 密切关注可以执行的优化,

除其他事项外。 对我来说,当我调试或重构时,推理部分起着最大的作用。

以您提到的示例为例:当我试图找出函数的问题时,引用透明对我有很大帮助。 引用透明性确保当我在使用该函数时,给它提供不同的参数,我知道该函数在程序中的反应方式相同。 除了参数之外,它不依赖其他任何内容。 相对于命令式语言,该功能可能依赖于某些可能在我的眼皮底下改变的外部变量,这使得该函数更易于推理。

另一种看待它的方式(这在重构时更有用)是,您越了解代码满足某些属性,就越容易进行推理。 我知道,例如

map f (map g xs) === map (f . g) xs

这是一个有用的属性,我在重构时可以直接应用。 我可以声明Haskell代码的此类属性,这一事实使我们更容易进行推理。 我可以尝试在Python程序中声明此属性,但是我对此的信心要低得多,因为如果我对fg的选择不走运,结果可能会发生很大的变化。

kqr answered 2020-02-17T09:32:03Z
14 votes

非正式的意思是,“仅通过查看代码就能知道程序将执行什么操作。” 由于副作用,强制转换,隐式转换,重载的函数和运算符等原因,在大多数语言中这可能会令人惊讶地困难。即,当您无法仅靠大脑思考代码时,就必须运行它来查看什么 它将针对给定的输入。

John Wiegley answered 2020-02-17T09:32:25Z
12 votes

通常,当人们说“推理”时,它们的意思是“等式推理”,这意味着无需运行代码就可以证明您的代码的属性。

这些属性可以非常简单。 例如,给定以下fid的定义:

id :: a -> a
id x = x

(.) :: (b -> c) -> (a -> b) -> (a -> c)
(f . g) = \x -> f (g x)

...然后我们可能想要证明:

f . id = f

这很容易证明,因为:

(f . id) = \x -> f (id x) = \x -> f x = f

请注意,我是如何针对所有f证明这一点的。这意味着我知道无论如何该属性始终为真,因此我不再需要在某种单元测试套件中对其进行测试,因为我知道它永远不会失败 。

Gabriel Gonzalez answered 2020-02-17T09:33:04Z
9 votes

“对程序进行推理”就是“对程序进行分析以查看其作用”。

这个想法是,通过人工更改程序和通过机器编译程序或分析破损情况,纯度可以简化理解。

nponeccop answered 2020-02-17T09:33:28Z
0 votes

正如@John Wiegley所说,关于理由的意思

只需看一下代码就能知道程序将做什么

更重要的是要了解阻碍我们推理代码的因素。 这些是副作用。

Alexandr answered 2020-02-17T09:33:57Z
translate from https://stackoverflow.com:/questions/18666821/what-does-the-term-reason-about-mean-in-computer-science