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;?
更具体的名称答案 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) -> o
是continuation-passing style的特征签名,所以也许这就是你在这里重新发明的东西。
您的测试用例看起来像您最想要的是预处理函数参数的方法。正如Marko Topolnik已经评论过的那样,只是composition
assertEquals(
200.0,
({ x: Double -> x + 100.0 }
compose { x -> sin(x)*100.0 }) (PI/2)
)
(不确定我是否已经获得了Kotlin语法)