6.1 泛型高阶函数

728 篇文章 1 订阅
349 篇文章 0 订阅

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值