【发布时间】:2019-08-11 21:34:18
【问题描述】:
我知道纯函数是一个不依赖系统状态、没有副作用、输出只依赖于输入的函数。
进行 http 调用被认为是副作用。因此,以下是不纯函数的示例:
const httpCall = (url, params) => $.getJson(url, params)
但是,只是延迟评估,我们可以将该函数转换为纯函数,如下所示:
const pureHttpCall = (url, params) => () => $.getJson(url, params)
我们不再进行 http 调用。相反,我们返回一个函数,它会在被调用时执行此操作。这个函数是纯函数,因为它总是在给定相同输入的情况下返回相同的输出:在给定 url 和参数的情况下进行特定 http 调用的函数。
但这让我很困惑。因为当我们调用这个返回的函数时,无论如何我们都会进行 http 调用。我看不出这种“延迟评估”如何消除我们系统中的杂质。
我认为我需要澄清其中的一些概念,因为我不明白副作用(如 http 调用)如何适合函数式范式。
【问题讨论】:
-
函数纯度没有考虑更深层次的返回值。它只关心
pureHttpCall的返回值,给定相同的输入,它是相同的:发出HTTP 请求的函数。返回的函数不是纯函数。 -
@Li357 那么.. 我可以说
pureHttpCall是纯函数,它的返回值是一个不纯函数吗? -
是的。返回的函数是实际执行副作用的函数,而纯函数不执行。
-
@Li357 这就是你通常如何处理函数式编程中的副作用和不纯的东西?
-
基本上是的。只需传递表达式而不对其进行评估(即惰性评估),并且仅在您处于不纯环境中时才评估它们。
标签: javascript functional-programming