const tryCatch = (f) => {
try {
return Right(f())
} catch (e) {
return Left(e)
}
}
const tryCatch = (f) => {
try {
return Right(f())
} catch (e) {
return Left(e)
}
}
tryCatch
函数本身不是纯函数。
在函数式编程中,纯函数指的是满足以下两个条件的函数:
tryCatch
函数违反了第二个条件,因为它执行了 I/O 操作(尽管在这里是间接的,即调用了一个可能产生副作用的函数 f
)。此外,它还依赖于 JavaScript 的运行时环境来执行 try
/catch
块,这同样可能产生副作用(尽管在大多数情况下这些副作用是隐藏的或不可见的)。
但是,如果我们假设 f
是一个纯函数,并且 Right
和 Left
是不会产生副作用的函数(即它们只是返回一个新的值,而不是修改任何外部状态),那么 tryCatch
函数对于相同的 f
总是返回相同的输出(即要么是 Right
包裹的 f
的结果,要么是 Left
包裹的错误)。在这种情况下,我们可以说 tryCatch
对于特定的纯函数 f
是确定性的。
然而,由于它依赖于外部函数 f
的行为,并且可能执行有副作用的操作,因此我们不能将 tryCatch
本身称为纯函数。
不是,因为不知道
Left
Right
f
是不是纯函数只有这仨都是纯函数时,
tryCatch
才是纯函数