纯函数可以异步吗?
Can pure functions be asynchronous?
在遍历纯函数的定义时,它通常定义有两个特征:
1) 给定相同的输入应该产生相同的输出
2) 不应产生任何副作用
这是否也意味着纯函数不应该是异步的?如果没有,怎么会?如果是的话,我很乐意在 JavaScript.
中看到一些异步纯函数的例子
是的,异步函数与常规函数没有什么不同,除了异步意味着它 returns Promise<T>
而不仅仅是 T
,话虽如此,这是与同步的唯一区别可以是纯函数,因此异步函数也可以是纯函数
示例:
async function willBeValue<T>(value: T): Promise<T> { return await value; }
是的,异步函数通常不是纯粹的,因为它与要求 #2 冲突:无副作用。
我们使用异步函数的大多数事情本质上都是有副作用的:I/O、网络内容、计时器。但即使我们忽略这些,promises 本身也依赖于某种全局状态来实现异步:事件循环。这通常不符合我们对纯度的定义。
另一方面,我们在争论函数的纯度时可以简单地忽略这些,就像我们忽略计算对我们真实世界的机器产生的所有低级影响和时序一样。如果您想争辩说您的异步函数是纯函数,那么您应该始终明确说明这个假设。在争论两个异步值的等价性时,您需要对如何建模异步效果有一个复杂的想法,例如在 Promise.race
.
的评价中
在遍历纯函数的定义时,它通常定义有两个特征:
1) 给定相同的输入应该产生相同的输出
2) 不应产生任何副作用
这是否也意味着纯函数不应该是异步的?如果没有,怎么会?如果是的话,我很乐意在 JavaScript.
中看到一些异步纯函数的例子是的,异步函数与常规函数没有什么不同,除了异步意味着它 returns Promise<T>
而不仅仅是 T
,话虽如此,这是与同步的唯一区别可以是纯函数,因此异步函数也可以是纯函数
示例:
async function willBeValue<T>(value: T): Promise<T> { return await value; }
是的,异步函数通常不是纯粹的,因为它与要求 #2 冲突:无副作用。
我们使用异步函数的大多数事情本质上都是有副作用的:I/O、网络内容、计时器。但即使我们忽略这些,promises 本身也依赖于某种全局状态来实现异步:事件循环。这通常不符合我们对纯度的定义。
另一方面,我们在争论函数的纯度时可以简单地忽略这些,就像我们忽略计算对我们真实世界的机器产生的所有低级影响和时序一样。如果您想争辩说您的异步函数是纯函数,那么您应该始终明确说明这个假设。在争论两个异步值的等价性时,您需要对如何建模异步效果有一个复杂的想法,例如在 Promise.race
.