Scala实现支持任意类型A的函数复合iter函数时如何递归传类型A?
问题原因
你当前代码编译失败的核心是类型不匹配:
- 你定义的参数
f类型为A => A,要求入参是A类型的实例 - 而
iter(f, n-1)的返回值是A => A类型的函数,直接传入f自然不符合类型要求
另外你写的预期效果iter(f,2) = f(f)是简写,实际函数复合的正确效果应该是iter(f,2)(x) = f(f(x)),也就是将f连续作用两次到输入参数上。
正确实现
递归版本
def iter[A](f: A => A, n: Int): A => A = { require(n >= 1, "n必须大于等于1") if (n == 1) { f } else { // 也可以替换为更直观的匿名函数写法:x => f(iter(f, n - 1)(x)) f compose iter(f, n - 1) } }
如果需要支持n=0的场景(返回恒等函数,代表连续调用0次f),可以调整边界判断:
def iter[A](f: A => A, n: Int): A => A = { require(n >= 0, "n必须大于等于0") if (n == 0) { identity[A] } else { f compose iter(f, n - 1) } }
非递归版本(避免大n场景下的栈溢出风险)
def iter[A](f: A => A, n: Int): A => A = { require(n >= 0, "n必须大于等于0") (1 to n).foldLeft(identity[A]) { (acc, _) => f compose acc } }
效果验证
// 测试用函数:给输入Int加1 val addOne: Int => Int = _ + 1 // 生成连续加1三次的函数 val addThree = iter(addOne, 3) println(addThree(2)) // 输出结果为5,符合2+1+1+1=5的预期
内容的提问来源于stack exchange,提问作者Raf
相关产品推荐
相关产品推荐

