【发布时间】:2016-08-30 10:39:04
【问题描述】:
如何根据某些逻辑条件停止或分支合成?
例如。假设我有以下代码:
compose(
operation4
operation3,
operation2,
operation1
)(myStuff);
甚至是类似的东西
myStuff
.map(operation1)
.map(operation2)
.map(operation3)
.map(operation4)
如果 myStuff 满足某些条件,我只希望执行操作 3 和 4。
我该如何实现(特别是在 JavaScript 中)?
我是否必须创建两个较小的组合并有一个单独的 if 语句,或者有没有办法在组合中包含条件?
Monads 能解决我的问题吗?如果有,怎么做?
【问题讨论】:
-
这可能取决于您使用的框架。如果您使用自己的 compose 函数,您可能只需扩展它以允许条件(例如
myStuff.map(a).if(b).map(c))。如果您使用的是外部框架,则可能需要将其拆分为两部分。 -
如果您想在不满足条件时立即停止合成,您可以将
Either应用为 monad(使用其chain方法)。如果您只想省略导致未满足条件的函数,您可以将Either应用为应用函子(使用其ap方法)或使用像Georg's answer中的三元函数运算符。 -
这样做是否足够
[myStuff].filter(predicate).map(fx1).map(fx2)或使用任何其他流库来解决这个问题? -
@LUH3417
Eithermonad 选项听起来像是我正在寻找的那种东西,但我对 Monad 还不是很了解。你介意用一个实现来回答吗? -
嗯,我不太确定
Either是否适合这种情况。如果我理解正确,您不想检查每个函数的条件,而只想检查第三个和第四个函数。我需要更仔细地考虑一下。
标签: javascript function functional-programming function-composition