有没有这样的函数式编程习惯用法?

时间:2018-02-22 13:28:43

标签: functional-programming kotlin

fun <I, O> ((I) -> O).modify(modifier: (I, (I) -> O) -> O): (I) -> O =
    { modifier(it, this) }

@Test
fun modify() {
    assertEquals(
        200.0,
        { x: Double -> x + 100.0 }
            .modify { x, parent -> parent(sin(x)*100.0) }(PI/2)
    )
}

我想要的是将一元函数F 1 (x)转换成另一个以某种方式使用第一个函数的一元函数F 2 (x)。我在这里重新发明轮子吗?此功能操作是否已具有比#34;修改&#34;?

更具体的名称

1 个答案:

答案 0 :(得分:0)

所以,在功能性,curried语法中

modify :: (i -> o) -> (i -> (i -> o) -> o) -> i -> o
modify f modifier x = modifier x f

请注意,您实际上并未使用modifier的第二个参数是函数的事实,即这严格来说是

的特殊化
modify :: a -> (i -> a -> o) -> i -> o
modify a modifier x = modifier x a

可以写

modify a modifier x = flip modifier a x

...允许我们η-reduce

modify a modifier = flip modifier a

翻盖本身也可以翻转:

modify a modifier = flip flip a modifier

......我们也可以减少其余部分:

modify = flip flip

无论这是值得的。

另一方面,(i -> o) -> ocontinuation-passing style的特征签名,所以也许这就是你在这里重新发明的东西。

您的测试用例看起来像您最想要的是预处理函数参数的方法。正如Marko Topolnik已经评论过的那样,只是composition

assertEquals(
    200.0,
    ({ x: Double -> x + 100.0 }
        compose { x -> sin(x)*100.0 }) (PI/2)
)

(不确定我是否已经获得了Kotlin语法)