笔友城堡 - 可定义的个人主页

前言

简单记录一下高阶函数函数类型,特别是带返回值的匿名函数Lambda 表达式的区别

记录于此,方便自己查阅。

正文

函数

val sumf = fun(a: Int, b: Int) = { a + b }
  • 语法解析:这里使用的是 匿名函数(Anonymous Function),而不是 Lambda 表达式

    // Lambda 通常是  
    val sumf = { a: Int, b: Int -> a + b }
  • 执行逻辑fun(a: Int, b: Int) = { a + b }的含义是:

    • 这个函数接收两个 Int参数 ab

    • 它的返回值不是一个 Int,而是一个 Lambda 表达式 { a + b }

    • 因为这个 Lambda 没有参数,所以类型是 () -> Int

    • 因此,整个表达式的类型是 (Int, Int) -> (() -> Int),即“接收两个 Int 参数,返回一个无参且返回 Int 的函数”。

怎么使用sumf?

sumf
  • 输出(kotlin.Int, kotlin.Int) -> () -> kotlin.Int

  • 解释:这正是上面说的类型。它是一个高阶函数,因为它返回了另一个函数。

sumf(1, 1)
  • 输出() -> kotlin.Int

  • 解释:调用 sumf(1, 1)时,参数 ab被赋值为 1,函数体执行 { a + b },也就是 { 1 + 1 },即 { 2 }。但在 Kotlin 中,Lambda 表达式本身就是一个对象,所以这里返回的是一个“无参、返回值为 2 的函数对象”,而不是直接的数值 2

sumf(1, 1).invoke()
  • 输出2

  • 解释.invoke()是 Kotlin 中调用函数对象的显式方式。它执行了那个返回的函数 { 2 },所以最终输出 2

sumf(1, 1)()
  • 输出2

  • 解释:这是 Kotlin 提供的语法糖,等同于 .invoke()。圆括号直接作用于函数对象,效果一样。

匿名函数 vs Lambda

你可能会疑惑,为什么写成 fun(...) = { ... }会变成这样?

  • Lambda 表达式val f = { a: Int, b: Int -> a + b }→ 类型是 (Int, Int) -> Int。它直接返回计算结果。

  • 匿名函数val f = fun(a: Int, b: Int) = { a + b }→ 类型是 (Int, Int) -> (() -> Int)。因为它把 { a + b }当作表达式,而这个表达式本身是一个 Lambda,所以它返回的是 Lambda。

通俗理解

  • Lambda 表达式 { a, b -> a + b }是一个“值”(函数对象)。

  • fun(a, b) = { a + b }的意思是:“定义一个函数,它接收 a 和 b,然后返回那个 Lambda 值”。

总结

代码含义结果类型说明
fun(a: Int, b: Int) = { a + b }定义匿名函数(Int, Int) -> (() -> Int)返回的是一个 Lambda
sumf(1, 1)调用函数,传入 1, 1() -> Int得到的是 { 2 }这个对象
sumf(1, 1)()调用返回的 LambdaInt最终得到值 2

sumf 是一个高阶函数类型,严格来说应该是“sumf 是一个高阶函数(因为它返回函数)”,它的类型是高阶函数类型。

参考文章

  1. AI

相关文章

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...