【发布时间】: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