【问题标题】:Can a "pure" function reference a property?“纯”函数可以引用属性吗?
【发布时间】:2021-09-23 20:46:00
【问题描述】:

纯函数是一个给定相同参数、总是返回相同结果且没有副作用的函数。

所以 Sum(x,y) => x + y;是纯粹的,因为它符合这个标准。

但是,在像 C# 这样可以拥有属性的语言中,这会使事情变得更加复杂......

class Summer
{
  public int X { get; set; }
  public int Y { get; set; }

  public int Sum() => X + Y;
}

在上面,Sum 可以被认为是纯的吗?你能说 X 和 Y 仍然只是函数的参数吗?

或者如果重构为类似的东西会更好:

class Summer
{
  public int X { get; set; }
  public int Y { get; set; }
}
static class SummerExn
{
  public static int Sum(this Summer s)
  {
    return s.X + s.Y;
  }
}

在扩展方法中,s 是一个参数,因此我认为这符合纯粹的标准,但实际上并没有实际差异,因为基础变量是相同的。这段代码更好,比如更容易测试、更快、内存效率更高、更容易逻辑推理等是否有技术原因?

【问题讨论】:

  • 我会说只有属性本身是纯的。
  • 具有 X 和 Y 属性并调用 Sum() 获取 X 和 Y 的版本不是纯的。容易证明:调用Sum(),得到0。将X设置为1。调用Sum()得到1。用相同的参数调用,得到不同的结果。
  • 现在已经关闭,因为它是基于意见的 - 我不确定这是否正确。一个函数要么是纯的,要么不是,我的问题是“这是纯的”。任何人都可以建议进行编辑以使其更清晰吗?
  • 根据你对纯粹性的定义,你的第二种方法实际上不是纯粹的,因为它可能多次传递对单个Summer对象的“相同”引用并得出不同的结果(如果@ 987654328@ 之间发生了变异)。当然,如果您将this 视为隐藏参数,则完全相同的参数适用于第一种方法。换句话说:只要您混合对可变对象的引用,实际上就没有区别,也不会有区别。您可以拥有不会修改状态的方法,因此更容易推理,但这不是一回事。

标签: c# oop purely-functional


【解决方案1】:

您的示例不符合您给出的定义:

纯函数是一个给定相同参数的函数,总是返回相同的结果...

每个调用都有相同的参数(无),但显然可以返回不同的结果。 Wikipedia 的另一个定义使这一点更加明确:

对于相同的参数,函数返回值是相同的(局部静态变量、非局部变量没有变化...)

属性是非局部变量。

而且要特别迂腐,您的示例不仅不是纯函数,而且根本不是函数。作为非静态类成员的类似函数的东西称为方法

【讨论】:

  • 谢谢,但我不确定我是否理解 - 维基百科的定义并没有说它不能使用非局部变量,只是说它们不能有变化,除非我'我误读了。如果我不更改调用之间的属性值,那么每次调用它的结果都是一样的。另外,我知道 C# 将此称为方法,但这是一个重要的区别吗?如果它有助于更​​清晰,我完全赞成迂腐。
  • 重要的是它可以改变,而不是它在特定情况下做了或没有改变。一个不纯的函数,因为它有时会改变外部状态,当它不改变状态时,它不会变成纯函数。当外部状态改变时返回不同值的函数不会在状态不改变时变为纯函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2014-04-13
  • 1970-01-01
  • 2018-08-05
  • 2019-12-14
  • 2010-09-26
  • 1970-01-01
相关资源
最近更新 更多