Kotlin高阶函数组合疑问:如何声明式定义组合函数
解决Kotlin中二元函数组合的问题
嘿,我完全get到你的困惑点了!你想要实现的是一个高阶组合函数,但核心误区在于:你的compose函数不应该直接计算总和,而是要返回一个新的二元函数——这个新函数会在被调用时接收参数,再把参数传给那两个输入函数,最后返回它们的结果之和。
核心思路
你不需要在compose函数内部决定传入什么参数,而是把参数的接收逻辑交给返回的新函数。也就是说,compose的返回类型应该是(Int, Int) -> Int,而不是直接返回Int。
实现代码
先看最清晰的完整写法:
fun compose(f: (Int, Int) -> Int, g: (Int, Int) -> Int): (Int, Int) -> Int { // 返回一个lambda,它会接收a和b,分别传给f和g后求和 return { a, b -> f(a, b) + g(a, b) } }
Kotlin支持更简洁的写法,省略返回类型和return关键字:
fun compose(f: (Int, Int) -> Int, g: (Int, Int) -> Int) = { a, b -> f(a, b) + g(a, b) }
用法示例
我们可以定义两个测试用的二元函数,然后用compose组合它们:
// 加法函数 fun add(a: Int, b: Int) = a + b // 乘法函数 fun multiply(a: Int, b: Int) = a * b // 组合add和multiply得到新函数 val combinedFunction = compose(add, multiply) // 调用新函数时传入具体参数 println(combinedFunction(2, 3)) // 输出:(2+3) + (2*3) = 5 + 6 = 11
为什么这样可行?
compose函数的作用是封装组合逻辑,它只负责定义“如何把两个函数的结果相加”,而具体的参数值是在调用最终返回的combinedFunction时才传入的。这样就完美解决了你不知道传什么参数的问题——因为参数根本不需要在compose里决定!
内容的提问来源于stack exchange,提问作者Thomas Cook
相关产品推荐
相关产品推荐

