You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:09:04