本文介绍纯功能转换的概念和术语。 转换数据的功能转换方法可生成代码,这些代码通常比传统命令性编程更快速、更具表现力、更易于调试和维护。
请注意,本节中的文章不打算完全解释函数编程。 相反,这些文章会识别一些功能编程功能,以便更轻松地将 XML 从一个形状转换为另一个形状。
什么是纯功能转换
在 纯函数转换中,一组函数称为 纯函数,定义如何将一组结构化数据从其原始形式转换为另一种形式。 “pure”一词表示函数 是可组合的,这要求它们是:
- 自包含,以便它们可以自由排序和重新排列,而无需与程序的其余部分纠缠或相互依赖。 纯转换不了解其环境,对环境也没有任何影响。 也就是说,转换中使用的函数没有 副作用。
- 无状态,以便在同一输入上执行相同的函数或特定函数集将始终产生相同的输出。 纯转换对于先前对它的使用没有记忆。
重要
在本教程的其余部分,术语“纯函数”用于一般意义上指示编程方法,而不是特定的语言功能。
请注意,纯函数必须作为 C# 和 Visual Basic 中的函数实现为方法。
不应将纯函数与C++中的纯虚拟方法混淆。 后者表示包含类是抽象的,并且未提供方法正文。
函数编程
函数编程 是一种直接支持纯功能转换的编程方法。
从历史上看,通用函数编程语言(如 ML、Scheme、Haskell 和 F#)主要对学术界感兴趣。 尽管在 C# 和 Visual Basic 中始终可以编写纯功能转换,但这样做的难度并没有使它成为大多数程序员的有吸引力的选择。 然而,在最新版本的这些语言中,新语言构造(如 lambda 表达式和类型推理)使函数编程更加简单高效。
有关函数编程的详细信息,请参阅 函数编程与命令性编程。
特定于域的函数式编程语言
虽然一般函数编程语言尚未得到广泛采用,但一些特定于域的函数编程语言取得了更好的成功。 例如,级联样式表(CSS)用于确定许多网页的外观,可扩展样式表语言转换(XSLT)样式表在 XML 数据作中广泛使用。 有关 XSLT 的详细信息,请参阅 XSLT 转换。
术语
以下列表定义了与功能转换相关的一些术语。
高阶 (一等) 函数
一个可被视为编程对象的函数。 例如,可以向其他函数传递或返回高阶函数。 在 C# 和 Visual Basic 中,委托和 lambda 表达式是支持更高顺序函数的语言功能。 若要编写高阶函数,请声明一个或多个参数来接受委托,并在调用委托时经常使用 lambda 表达式。 许多标准查询运算符都是高阶函数。
有关详细信息,请参阅标准查询运算符概述(C#)和标准查询运算符概述(Visual Basic)。
lambda 表达式
实质上是一个匿名的内联函数,可用在任何需要委托类型的地方。 这是 lambda 表达式的简化定义,但它足以满足本教程的目的。
有关详细信息,请参阅 Lambda 表达式(C# 编程指南)和 Lambda 表达式(Visual Basic)。
集合
结构化数据集,通常是一种统一类型。 若要与 LINQ 兼容,集合必须实现 IEnumerable 接口或 IQueryable 接口(或其泛型对应项之一或 IEnumerator<T>IQueryable<T>)。
元组(匿名类型)
一种数学概念,元组是一个有限的对象序列,每个对象都有特定类型。 元组也称为有序列表。 匿名类型是此概念的语言实现,它使未命名的类类型能够声明,同时实例化该类型的对象。
有关详细信息,请参阅匿名类型(C# 编程指南)和匿名类型(Visual Basic)。
类型推理(隐式确定类型)
编译器在缺少显式类型声明的情况下确定变量的类型的能力。
有关详细信息,请参阅隐式类型局部变量(C# 编程指南)和本地类型推理(Visual Basic)。
延迟执行和延迟评估
推迟表达式的求值,直到真正需要其求值结果为止。 集合中支持延迟执行。
有关更多 C# 信息,请参阅 LINQ 查询简介(C#)和 LINQ to XML 中的延迟执行和延迟评估(C#)。
有关更多 Visual Basic 信息,请参阅基本查询操作(Visual Basic)和LINQ to XML 中的延迟执行和延迟评估(Visual Basic)。
本部分的代码示例中将使用这些语言功能。