深一互联网站建设怎样,用rp怎么做网站导航菜单,网站推广需求要素,专业网站制作电话泛型概述 , 如何定义泛型函数
1 . 泛型的定义 在仓颉编程语言中#xff0c;泛型机制允许我们定义参数化类型#xff0c;这些类型在声明时不具体指定其操作的数据类型#xff0c;而是作为类型形参保留#xff0c;待使用时通过类型实参来明确。这种灵活性在函数和类型声明中…泛型概述 , 如何定义泛型函数
1 . 泛型的定义 在仓颉编程语言中泛型机制允许我们定义参数化类型这些类型在声明时不具体指定其操作的数据类型而是作为类型形参保留待使用时通过类型实参来明确。这种灵活性在函数和类型声明中尤为常见如Array和Set等容器类型就是典型的泛型应用。以数组为例由于我们可能需要在数组中存储多种不同类型的数据因此不可能为每种数据类型都定义一个专门的数组类型。通过引入泛型我们可以在数组类型声明时声明一个或多个类型形参如T并在实际使用数组时指定这些形参的具体类型从而避免了代码的大量重复。
在仓颉编程语言的体系中不仅函数声明可以是泛型的就连class、interface、struct以及enum的声明也都可以声明类型形参即它们都可以被设计为泛型。为了更清晰地讨论这一机制我们引入了几个关键术语类型形参用于在声明时占位等待具体类型的填充类型变元则是在声明体中引用这些形参的标识符类型实参则是在实际使用泛型类型或函数时提供的具体类型而类型构造器则是指那些需要接收类型实参以完成其定义的类型。
综上所述泛型在仓颉编程语言中是一种强大的工具它允许我们在不牺牲类型安全的前提下编写出更加灵活和可复用的代码。通过声明所要使用对象的类型以类型形参的形式并在使用时指定具体的类型实参我们能够实现代码的泛型化减少重复提高开发效率。
2 . 如何声明泛型
在声明类型或函数时类型形参通常会被放置在类型名称或函数名称之后并使用尖括号…来包围以明确标识出这些形参的存在。例如一个泛型列表在支持泛型的编程语言中可以被声明为在列表类型名称后紧跟尖括号并在尖括号内指定一个或多个类型形参如List所示其中T就是一个类型形参的标识符。
class ListT {var elem: OptionT Nonevar tail: OptionListT None
}在List的声明中T被称为类型形参它代表了一个在声明时未具体指定而在使用时需要被替换为具体类型的占位符。对于表达式如elem: Option中的T以及tail: OptionList中的T这些在泛型类型内部被引用的标识符被称为类型变元因为它们代表了类型形参在泛型类型定义中的具体引用点。
当我们在函数或变量声明中实际使用泛型类型时如sumInt函数的参数List其中的Int64就被称为List的类型实参。这些类型实参是在使用泛型类型时提供的具体类型它们替代了泛型声明中的类型形参从而构造出了具体的类型实例。
List本身在这里被视为一个类型构造器因为它是一个需要类型实参来构造出具体类型的泛型类型。通过提供Int64作为类型实参给List我们构造出了一个专门用于存储Int64类型元素的列表类型即List。这个过程展示了泛型类型如何通过类型实参的替换来生成具体的、可操作的类型实例。
3. 全局泛型函数
在声明全局泛型函数时只需要在函数名后使用尖括号声明类型形参然后就可以在函数形参、返回类型及函数体中对这一类型形参进行引用。例如 id 函数定义为
func idT(a: T): T {return a
}在这里我们定义了一个名为id的泛型函数该函数声明了一个名为a的变量作为形参其类型由泛型类型形参T指定。a: T是函数id的形参声明其中T是id函数声明的类型形参它用于在函数体内引用和操作a同时也决定了id函数的返回类型通常id函数会返回其输入参数因此返回类型也是T。
接下来考虑一个更复杂的泛型函数定义名为composition。这个函数声明了三个类型形参T1、T2、和T3。composition的功能是将两个函数复合成一个新的函数。具体而言它接受两个函数f和g作为参数其中f是一个从T1类型到T2类型的函数即f: (T1) - T2而g是一个从T2类型到T3类型的函数即g: (T2) - T3。通过这两个函数的组合composition函数生成了一个新的函数该函数的类型是从T1到T3的即(T1) - T3它首先应用f函数到其输入上然后将f的输出作为g的输入最后返回g的输出。这样composition函数实现了两个函数的串联调用。
func compositionT1, T2, T3(f: (T1) - T2, g: (T2) - T3): (T1) - T3 {return {x: T1 g(f(x))}
}因为被用来复合的函数可以是任意类型例如可以是 (Int32) - Bool, (Bool) - Int64 的复合也可以是 (Int64) - Rune, (Rune) - Int8 的复合所以才需要使用泛型函数。
func times2(a: Int64): Int64 {return a * 2
}func plus10(a: Int64): Int64 {return a 10
}func times2plus10(a: Int64) {return compositionInt64, Int64, Int64(times2, plus10)(a)
}main() {println(times2plus10(9))return 0
}4. 局部泛型函数
简单来说局部泛型函数就是在一个函数中嵌套另一个泛型函数
func foo(a: Int64) {func idT(a: T): T { a }func double(a: Int64): Int64 { a a }return (idInt64 ~ double)(a) (double ~ idInt64)(a)
}main() {println(foo(1))return 0
}