这些不同的功能像这样组合在一起
f1 -> f2 -> f3 -> f4 -> f5
我需要在f3周围添加两个新函数fx和fy:
f1 -> f2 -> fx -> f3 -> fy -> f4 -> f5
所以我需要对f3的参数进行预处理,然后对f3的输出进行后处理
此处函数fx进行了更改,并且fy将更改还原回去,但是fy需要fx的其他详细信息才能进行还原,例如要知道要还原为哪些值
问题是fx函数需要产生两个输出
first: output that is needed by f3
second: output that is needed by fy
问题: 如何在未直接连接在一起的功能之间共享依赖关系, 有没有一种解决这个问题的空间方法/技术?
仅供参考,我正在使用Java8
答案 0 :(得分:1)
我通过创建fk函数解决了这个问题,该函数通过在f3之前和之后调用fx来包装f3,这样我就可以共享所需的状态信息,类似于Aadit提出的箭头。
答案 1 :(得分:1)
我将对所有函数返回值使用某种类型A
;您将需要自己整理实类型。
这就是您描述的意图:
fx
将产生两个参数,我们将它们称为a
和b
。f3
将处理值a
并产生a'
。fy
将消耗a'
和b
并产生c
。让我们看看如何实现(我将为类型签名编写伪代码):
将fy
定义为一个接受两个参数并返回一个参数的函数:
(A, A) => A
将fyp
(“ fy预处理”的缩写)定义为一个函数,该函数需要一些预处理功能p
并执行fy
的逻辑,但必须对第一个参数进行预处理与p
。我们将以P => FY
的形式编写代码,其中P
是预处理函数的类型签名,而FY
是fy
的类型签名:
P => FY, which expands to
(A => A) => (A, A) => A
因此,此函数的实现应将类型为p
的预处理函数A => A
作为输入,并执行fy
的逻辑(这是右边的{{1 }} ...请注意,它如何与(A, A) => A
的签名相对应,但是在执行逻辑之前,它将把fy
的第一个参数与fy
映射。以下是一些Scala实现供参考(我对Java不太满意):
p
其中val fyp: (A => A) => ((A, A)) => A =
f => fyuParams => performFyLogic((f(fyuParams._1), fyuParams._2))
是performFyLogic
函数的实际处理逻辑。
将最终组成定义为:
fy
这里有完整的Scala实现供参考(同样,不太了解Java 8):
f1 -> f2 -> fx -> fyp(f3)