函数式编程依赖性:如何在未直接连接在一起的函数之间共享依赖性

时间:2019-05-01 06:53:36

标签: functional-programming functional-dependencies functional-java

这些不同的功能像这样组合在一起

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

2 个答案:

答案 0 :(得分:1)

我通过创建fk函数解决了这个问题,该函数通过在f3之前和之后调用fx来包装f3,这样我就可以共享所需的状态信息,类似于Aadit提出的箭头。

答案 1 :(得分:1)

我将对所有函数返回值使用某种类型A;您将需要自己整理实类型。

这就是您描述的意图:

  • 函数fx将产生两个参数,我们将它们称为ab
  • 函数f3将处理值a并产生a'
  • 最后,fy将消耗a'b并产生c

让我们看看如何实现(我将为类型签名编写伪代码):

  1. fy定义为一个接受两个参数并返回一个参数的函数:

    (A, A) => A
    
  2. fyp(“ fy预处理”的缩写)定义为一个函数,该函数需要一些预处理功能p并执行fy的逻辑,但必须对第一个参数进行预处理与p。我们将以P => FY的形式编写代码,其中P是预处理函数的类型签名,而FYfy的类型签名:

    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函数的实际处理逻辑。

  3. 将最终组成定义为:

    fy

这里有完整的Scala实现供参考(同样,不太了解Java 8):

f1 -> f2 -> fx -> fyp(f3)