6.1 泛型高阶函数
高阶函数是写泛型函数式代码的一种方法,就是说,相同的代码可针对许多类似但不同的目的重复使用。这是现代编程的关键,因为,它能够写更少的代码,通过构造(factoring)出计算的共同部分。
在函数编程和面向对象编程中的泛型代码
写泛型代码,通常要对值执行某个操作,但是,由于代码应该是通用的,因此,对值的类型不要有太多的限制,要允许代码进一步扩展的能力。
使用面向对象编程初步解决(但不总是最好)这个问题,是声明接口。分配给方法的实际值将具有接口所需的所有操作,因此,在这个值上,执行所需操作是可能的。C# 中的小例子,看起来可能像这样:
interface ITestAndFormat {
bool Test();
string Format();
}
void CondPrint(ITestAndFormat tf) {
if (tf.Test()) Console.WriteLine(tf.Format());
}
在函数编程中,处理泛型方法常规做法是,使用类型参数,能够处理任何类型。然而,我们并不知道,针对某个值到底能够执行什么操作,因为,类型参数可以被任何实际类型替代。结果,函数语言使用不同的方法描述操作:传递函数,处理额外的参数值。前面的示例的 C# 函数版如下所示:
void CondPrint<T>(T value, Func<T, bool> test, Func<T, string> format) {
if (test(value)) Console.WriteLine(format(value));
}
对于少数函数来说,这是一种非常有效的方法,因为,我们不需要事先声明接口;对于更复杂的函数,仍然可能要使用接口,我们将在第九章中看到。此外,调用函数更容易,因为,能够使用 lambda 函数实现操作。正如我们将在第 6.6 节中看到,在 F# 中,由于使用类型推断,写这样的代码将大为简化。
高阶函数对函数编程来说非常重要,很快我们将会看到,它们如何用于处理几种函数值。比如,补充材料“在函数编程和面向对象编程中的泛型代码”中的 CondPrint 方法,对我们来说很重要,因此,需要它看看在 F# 中如何能够实现。
高阶函数是写泛型函数式代码的一种方法,就是说,相同的代码可针对许多类似但不同的目的重复使用。这是现代编程的关键,因为,它能够写更少的代码,通过构造(factoring)出计算的共同部分。
在函数编程和面向对象编程中的泛型代码
写泛型代码,通常要对值执行某个操作,但是,由于代码应该是通用的,因此,对值的类型不要有太多的限制,要允许代码进一步扩展的能力。
使用面向对象编程初步解决(但不总是最好)这个问题,是声明接口。分配给方法的实际值将具有接口所需的所有操作,因此,在这个值上,执行所需操作是可能的。C# 中的小例子,看起来可能像这样:
interface ITestAndFormat {
boolTest();
stringFormat();
}
void CondPrint(ITestAndFormat tf) {
if(tf.Test()) Console.WriteLine(tf.Format());
}
在函数编程中,处理泛型方法常规做法是,使用类型参数,能够处理任何类型。然而,我们并不知道,针对某个值到底能够执行什么操作,因为,类型参数可以被任何实际类型替代。结果,函数语言使用不同的方法描述操作:传递函数,处理额外的参数值。前面的示例的 C# 函数版如下所示:
void CondPrint<T>(T value, Func<T,bool> test, Func<T, string> format) {
if(test(value)) Console.WriteLine(format(value));
}
对于少数函数来说,这是一种非常有效的方法,因为,我们不需要事先声明接口;对于更复杂的函数,仍然可能要使用接口,我们将在第九章中看到。此外,调用函数更容易,因为,能够使用 lambda 函数实现操作。正如我们将在第 6.6 节中看到,在 F# 中,由于使用类型推断,写这样的代码将大为简化。
高阶函数对函数编程来说非常重要,很快我们将会看到,它们如何用于处理几种函数值。比如,补充材料“在函数编程和面向对象编程中的泛型代码”中的CondPrint 方法,对我们来说很重要,因此,需要它看看在 F# 中如何能够实现。