泛型
文章平均质量分 57
心想才事成
这个作者很懒,什么都没留下…
展开
-
6.1.1 写 F# 中的泛型函数
6.1.1 写 F# 中的泛型函数 在第 5 章,我们看到了一个简单的泛型函数,它只使用单个参数值,是一个泛型选项类型。清单 6.1 显示 CondPrint 方法的 F# 实现,来自"在函数式编程和面向对象中的泛型代码"侧边栏。它有三个参数值:一个值、一个函数,用于 测试是否应打印这个值,还有一个函数,用于设置格式化这个值。 Listing 6.1 Generic fun翻译 2011-05-06 14:47:00 · 668 阅读 · 0 评论 -
4.2.2 计算数据
4.2.2 计算数据 在这个应用程序的第一个版本中,我们将只打印标签,以及图表中每一项所占比例(百分比)。要计算百分比,就需要知道列表中所有项目数值总和,这个值用清单 4.4 中的函数 calculateSum 来计算。 清单 4.4 计算列表中的数值和 (F# Interactive)> let rec calculateSum(rows) = matchrows翻译 2014-10-11 09:49:28 · 806 阅读 · 0 评论 -
6.1.2.2 F# 的管道运算符
6.1.2.2 F# 的管道运算符 使用管道运算符(|>),能够把函数的第一个参数写在左边,即,在函数名的前面。这是非常有用的,比如,想调用几个函数,处理序列中的值,想要找出第一个处理的值。下面的示例演示了反转 F# 列表,然后,得到一个元素: List.hd(List.rev [1 .. 5]) 这种写法并不优雅,因为,写的操作顺序与执行的顺序相反,且要处理的值在右边,括翻译 2014-10-28 15:04:33 · 1911 阅读 · 0 评论 -
6.1.1 F# 中的泛型函数
6.1.1 F# 中的泛型函数 在第五章,我们看过一个简单的泛型函数,它只有一个泛型选项类型的参数。清单 6.1 是用F# 实现CondPrint 方法的,来自"在函数式编程和面向对象中的泛型代码"侧边栏。它有三个参数值:一个值、一个函数,用于测试是否应打印这个值,还有一个函数,用于设置格式化这个值。 清单 6.1 泛型函数 condPrint (F# Interactive)翻译 2014-10-28 11:13:13 · 785 阅读 · 0 评论 -
6.1 泛型高阶函数
6.1 泛型高阶函数高阶函数是写泛型函数式代码的一种方法,就是说,相同的代码可针对许多类似但不同的目的重复使用。这是现代编程的关键,因为,它能够写更少的代码,通过构造(factoring)出计算的共同部分。在函数编程和面向对象编程中的泛型代码写泛型代码,通常要对值执行某个操作,但是,由于代码应该是通用的,因此,对值的类型不要有太多的限制,要允许代码进一步扩展的能翻译 2014-10-28 09:00:02 · 833 阅读 · 0 评论 -
6.6.2 自动泛型化(automatic generalization)
6.6.2 自动泛型化(automatic generalization) 在这一章,我们已经实现了几个 F# 的高阶函数,也看到了在 F# 和 C# 中并排的实现。F# 实现的很重要方面,是我们根本不需要指定类型;这是由于有了自动泛型化(automatic generalization),它用在推断函数声明的类型。我们将用Option.bind 函数的实现作为示例,介绍这个过程是如何工作翻译 2014-11-18 11:20:06 · 901 阅读 · 0 评论 -
6.7.2 理解列表函数的类型签名
6.7.2 理解列表函数的类型签名 前面提到过,我们使用函数来筛选和映射列表,都很直观。在本节,我们将看到它们的类型签名,知道只通过此信息,就可以推断出高阶函数能做什么。当然,在一般情况下,不能从函数的类型就知道它能做什么,但对于泛型和高阶函数,例如那些用来处理列表的函数,通常是可能的。如我们前面所见的,处理泛型值的函数所做的不如单独处理值,因为,不能知道值的所有消息,因此,它们通常要翻译 2014-11-18 15:43:59 · 1363 阅读 · 0 评论 -
6.7.3 实现列表函数
6.7.3 实现列表函数 刚才我们看到的筛选和映射函数,没有展示如何实现,现在,我们要看一个在第三章开始创建的函数。因为所有的列表处理函数都有类似的结构,看过下面的示例以后,实现其他任何函数也是可能的。在第三章,我们写的函数,能够计算列表中的所有元素的和或积;随后,我们就意识到它可能比开始所表现的更有用:我们看到,它还能用来查找最小或最大元素。那时,我们没有讨论过泛型,因此,函数只处理翻译 2014-11-19 14:42:06 · 830 阅读 · 0 评论 -
6.7.3.1 在 C# 中实现 fold
6.7.3.1 在 C# 中实现 fold与 fold 有相同行为的操作,在 .NET 库中也有,但是,名字叫Aggregate(聚合)。通常,它是能够在任何集合类型上运行的扩展方法,我们也可以像 F# 函数一样使用它。清单 6.21 是我们用 C# 3.0 重写前面示例的代码。在 F# 中,我们用元组来保存在聚合过程中的状态。你也许还记得以前的几章中,我们曾提到过,C# 3.0 中的翻译 2014-11-19 15:46:12 · 1168 阅读 · 0 评论 -
5.5.2 函数类型
5.5.2 函数类型 我们已经看到,在 F# 中,用箭头符号写函数值的类型,这在很多方面类似于构造元组的方式。早些时候,我们看到过,可以使用带类星号(int * string)的类型构造器,从其他简单类型,构造出元组类型。构造函数类型的方法类似,只是使用函数类型构造器(int -> string)。在数学意义上,函数就是描述每个可能的输入和返回值之间的关系,因此,不需要指定大量的关系的所有翻译 2014-10-24 11:24:06 · 596 阅读 · 0 评论 -
3.4.2 参数化函数的好处
3.4.2 参数化函数的好处 我们看另一个使用这个函数的示例,为了不同的目的,初看起来,完全不同于计算列表元素的和或积。让我们看看,是否能找出最大值: > aggregateList max (-1) [ 4; 1; 5; 2;8; 3 ];; val it : int = 8 作为第一个参数的函数(max),是内置的 F# 函数,返回给定的两个参数中大的。我们用-1翻译 2014-09-29 11:42:06 · 1433 阅读 · 0 评论 -
6.1 泛型高阶函数
6.1 泛型高阶函数 高阶函数是写泛型函数代码的一种方法,这意味着,相同的代码可重复使用于许多类似但不同的目的。这是现代编程的一个关键,因为,它允许我们写更少的代码行,通过分解出计算的共同部分。 在函数式编程和面向对象中的泛型代码 当编写泛型代码时,通常要对我们所获得的值执行某个操作,但是,由于代码应该是泛型的,我们不想太多地限制值的类型,想要允许代码进一步翻译 2011-05-05 15:37:00 · 530 阅读 · 0 评论 -
14.2.6 实现模糊效果
14.2.6 实现模糊效果 我们最终的效果不只是一个颜色滤镜。模糊图像的过程依赖于计算新的像素值,基于多个原始像素。我们仍然可以执行逐个像素转换图像。不过,转型需要访问整个图像,以及我们想要转换的像素坐标。 我们把 RunEffect 和 RunEffectParallel 的实现留下作为练习,但它是相当简单的;这是只需改变循环的具体内容,给转换函数更多的信息翻译 2011-12-06 17:30:41 · 741 阅读 · 0 评论 -
3.2.2.1 更好地推断 C# 元组类型
3.2.2.1 更好地推断 C# 元组类型 在继续之前,我们想展示了一个 C# 的技巧,它能使后面使用元组的示例更简明。在前面的示例中,我们必须调用构造函数,创建元组类型的实例,这就要求显式指定类型参数。我们用 C# 3.0 中新的 var 关键字,C# 编译器能够推断变量的类型,但是,我们还可以做得更好。C# 中还有另外一个地方支持类型推断:调用泛型方法。如果调用泛型方法,它的类型参翻译 2014-09-16 22:27:51 · 812 阅读 · 0 评论 -
5.4.1 在 C# 中实现选项类型
5.4.1 在 C# 中实现选项类型 正如我们所看到的,在函数式编程中,选项(option)类型非常重要,我们也希望能够在 C# 中进行函数风格编程,因此,需要在C# 中实现适当的选项类型。我们已经讨论过如何用面向对象语言实现差别联合,这里代码的结构类似于我们前面讨论过的Schedule 类型。在Option 中,我们可以创建一个类(或值类型),有 HasValue 属性,虽然有点简单,但翻译 2014-10-22 15:51:41 · 1277 阅读 · 0 评论 -
5.4.2 F# 中的泛型选项类型
5.4.2 F# 中的泛型选项类型 F# 中的泛型类型本质上与 C# 中的泛型类相同,能够写更通用和可重用的类型。我们已经知道,在选项类型的情况中,就需要泛型,因为我们希望能够使用完全相同的泛型类型,创建带有不同类型的选项值。当然,我们要写出类型安全的代码,还需要知道这个选项类型到底带有哪种类型。正如在 C# 中,我们声明带有类型参数的类型,作为值类型使用,保存在 Some 可选值中。翻译 2014-10-22 16:46:37 · 817 阅读 · 0 评论 -
5.4.4 写泛型函数
5.4.4 写泛型函数 能处理泛型类型的大多数函数或方法都是高阶的(higher order),就是说,它们取其他函数作为参数值。这是一个非常重要的主题,我们会专门用一整章(第六章)来讨论,但我们在还没有进入高阶领域时,就已经可以写泛型函数了。我们准备创建的函数,参数为选项类型,返回包含的值;如果选项类型不包含值,函数将触发异常。我们可以先看一下 C# 版本: T ReadValu翻译 2014-10-23 13:56:13 · 660 阅读 · 0 评论 -
5.4.4 写泛型函数
5.4.4 写泛型函数 能处理泛型类型的大多数函数或方法都是高阶的(higher order),就是说,它们取其他函数作为参数值。这是一个非常重要的主题,我们会专门用一整章(第六章)来讨论,但我们在还没有进入高阶领域时,就已经可以写泛型函数了。我们准备创建的函数,参数为选项类型,返回包含的值;如果选项类型不包含值,函数将触发异常。我们可以先看一下 C# 版本: T ReadValu翻译 2014-10-23 14:04:14 · 483 阅读 · 0 评论 -
5.5.2.1 函数作为参数值和返回值
5.5.2.1 函数作为参数值和返回值 在第三章,我们已使用过,在 C# 和 F# 中把函数作为参数值,因此,这些基本概念不应该是新的;然而,我们还没有以这种方式使用过 lambda 函数。Lambda 函数是把函数写成另外函数的参数值的最简单方法。清单 5.17 提供了一个简单的示例。在清单中前面的函数,参数为一个数和一个函数,两次调用这个函数,第一次调用的结果作为第二次调用的参数值。翻译 2014-10-24 14:51:32 · 1079 阅读 · 0 评论 -
5.4 泛型值(Generic values)
5.4 泛型值(Generic values) 在本节,我们将讨论泛型类型[原文为generic type,泛型类型,应该可以简称为泛型]声明,可以发现,在很多方面,F# 中的泛型与C# 中的泛型很相似。到目前为止,我们唯一用 type 结构声明的类型,就是差别联合;在后面,我们会看到使用同样结构写的其他类型声明(特别是,在第七和第九章),但是,使类型成为泛型的语法,与现在将要看到的语法完翻译 2014-10-22 14:12:50 · 752 阅读 · 0 评论