6.1 泛型高阶函数

来源:互联网 发布:淘宝网中老年女衬衫 编辑:程序博客网 时间:2024/06/05 16:52

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# 中如何能够实现。

 

 

0 0
原创粉丝点击