##仓颉##
在仓颉编程语言中,函数是一等公民(first-class citizens)。这意味着函数可以像普通值一样作为参数传递、作为返回值使用,或赋值给变量。因此,函数本身也具有类型——称为函数类型。
函数类型的语法结构
函数类型由参数类型列表和返回类型组成,通过箭头 ->
连接:
(参数类型1, 参数类型2, ...) -> 返回类型
- 参数类型:用圆括号
()
包裹,多个参数用逗号分隔 - 无参数:使用空括号
()
- 返回类型:箭头右侧的类型(如无返回值则用
Unit
)
基础示例
// 类型: () -> Unit (无参数,无返回值)
func hello() {
println("Hello!")
}
// 类型: (Int64) -> Unit (单参数)
func display(a: Int64) {
println(a)
}
// 类型: (Int64, Int64) -> Int64 (多参数,有返回值)
func add(a: Int64, b: Int64): Int64 {
a + b
}
// 类型: (Int64, Int64) -> (Int64, Int64) (返回元组)
func returnTuple(a: Int64, b: Int64): (Int64, Int64) {
(a, b)
}
类型参数名的规则
可为参数添加显式类型名(增强可读性),但必须统一使用或省略:
// 正确:统一使用类型参数名
let handler: (name: String, price: Int64) -> Unit = showFruitPrice
// 正确:统一省略类型参数名
let handler: (String, Int64) -> Unit = showFruitPrice
// 错误:混合使用(编译失败)
let handler: (name: String, Int64) -> Unit // Error!
函数类型的应用场景
1. 作为参数类型
// 类型: ((Int64, Int64) -> Int64, Int64, Int64) -> Unit
func printAdd(addFunc: (Int64, Int64) -> Int64, a: Int64, b: Int64) {
println(addFunc(a, b)) // 调用传入的函数
}
// 使用
printAdd(add, 3, 5) // 输出: 8
2. 作为返回类型
// 类型: () -> (Int64, Int64) -> Int64
func returnAdd() -> (Int64, Int64) -> Int64 {
add // 返回add函数本身
}
// 使用
let funcRef = returnAdd()
println(funcRef(2, 3)) // 输出: 5
注意:
->
是右结合的,因此返回类型() -> (Int64, Int64) -> Int64
表示“返回一个函数”。
3. 作为变量类型
// 声明函数类型变量
let f: (Int64, Int64) -> Int64 = add
println(f(10, 20)) // 输出: 30
重载函数的处理
当函数重载时,直接使用函数名会引发歧义,需显式指定类型:
func add(i: Int64, j: Int64) -> Int64 { i + j }
func add(i: Float64, j: Float64) -> Float64 { i + j }
main() {
let f = add // Error! 编译器无法确定选择哪个重载
let g: (Int64, Int64) -> Int64 = add // OK: 显式声明类型
}
小结
仓颉语言的函数类型通过统一语法 (T1, T2) -> R
实现高度灵活性:
- ✅ 支持作为参数、返回值、变量
- ✅ 增强类型安全性与代码表达能力
- ❌ 禁止混合使用类型参数名
- ❌ 重载函数需显式声明类型
这一特性使仓颉语言能优雅地处理高阶函数、回调机制等复杂模式,为函数式编程范式提供坚实基础。
##仓颉##