【问题标题】:Is a method still "pure" if it invokes a designated callback given as parameter如果调用作为参数给出的指定回调,方法是否仍然“纯”
【发布时间】:2021-07-21 19:53:58
【问题描述】:

例如。 PureFoo(onSuccess: () => { DoSomething(); });(C# 中的示例)

如果Purefoo 调用onSuccess,它仍然算作纯(没有“副作用”)吗?还是该方法只是“诚实”的(因为不隐藏它的作用)?

我在 Google 上搜索过,但没有得到相关结果。

【问题讨论】:

  • 为了澄清,你是问如果一个函数调用非纯函数,它是否仍然是纯函数?
  • @Calculuswhiz 是的,就像“如果这样做,它是否仍然被认为是纯粹的”,因为不幸的是,C# 并不强制执行纯粹性。还是应该避免/从技术上讲不可调用/不再限定为纯。
  • Software Engineering看到这个问题。
  • 既然C#没有纯函数作为概念,如果你觉得还可以,有什么别的说法吗?
  • @LasseV.Karlsen 对我来说有点重要,因为我希望它确实执行了它,并且当有可能生成更清洁/更健壮的代码时,我会努力遵守它。

标签: functional-programming terminology


【解决方案1】:

所以,长话短说,这听起来不像。

如果有副作用,无论来自哪个来源,它都不应该/不能称为纯的。

但是,我想它仍然可以通过将副作用限制为仅所有明确和明确的预期回调来更诚实,这些回调可以作为基于返回值的替代返回 + 调用。 请注意,您不能确保仅在预期时调用回调以及预期的次数等。

【讨论】:

    【解决方案2】:

    在这种特殊情况下,onSuccess 有一个名称和一个签名(返回 void/unit),表示 有意 副作用。如果您的函数对 onSuccess() 调用的结果没有做任何事情,那么就没有任何可能传递到那里的东西来使外部调用成为纯函数。

    【讨论】:

    • 等等……所以……如果onSuccess 接受参数或仅在它确实返回某些东西时,它会改变一些东西吗?也不确定你的最后一句话。
    • 纯度是关于功能是如何实现的。它与呼叫站点无关。我是说如果你实现了PureFooonSuccess 的定义方式,就不能以纯粹的方式调用。不带参数且不返回任何内容的函数除了因其副作用而被调用之外没有其他可能的目的。
    猜你喜欢
    • 2016-08-02
    • 2020-07-03
    • 2018-09-11
    • 2011-10-06
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多