自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 资源 (7)
  • 收藏
  • 关注

翻译 5.5 函数值

5.5 函数值       我们已经看到过一个作为值使用的函数的示例(第 3 章),当时,写过一个函数,汇总列表元素,使用另一个函数作为参数值。以这种方式,我们能够使用相同的聚合,用于不同的目的:我们先用它来计算列表中的所有元素的总和,后面用来发现集合中最大元素。     使用数据的集合可能是最佳方式,显示为什么函数作为值使用是重要的。话虽如此,这远不是唯一情况,这个概念非常有用,在这本书的其余部分你将会看到。让我们首先来看一个命令式代码的示例,从给定集合中选出偶数,返回到另一个集合中:   va

2011-04-29 20:41:00 546

翻译 5.4.4 写泛型函数

5.4.4 写泛型函数       大多数使用泛型类型的函数或方法都是高阶的,意味着它们取另一个函数作为参数值。这是一个重要的主题,我们会专门用一整章 (第 6 章)来讨论,但我们已经可以写一个泛函数,而不用误入高阶领域。我们将创建一个函数,它取一个选项类型,并返回包含的值。如果这个选项类型不包含一个值,该函数将引发异常。我们可以先看一下 C# 版本:   T ReadValue(Option opt) {   T v;   if (opt.MatchSome(out v)) retu

2011-04-29 09:53:00 400

翻译 5.4.3 值的类型推断

5.4.3 值的类型推断       一般情况下,类型推断是一种机制,从代码推断出类型。其目的为了简化代码,消除了显式指定所有类型的需要。在本节中,我们会看到值的类型推断,使创建值更容易,不需要写出它们的类型。这并不是类型推断出现的唯一地方——尤其是在 F# 中——这是描述类型推的断第一部分。我们将在下一章中讨论函数(和方法)的类型推断,以及自动泛型化。   C# 3.0 中的类型推断      在 C# 中,值类型推断主要由 var 关键字表现,这是 C# 3.0 中的新功能。我们已经看到,清

2011-04-28 14:30:00 534

翻译 5.4.2 F# 中有泛型选项类型

5.4.2 F# 中有泛型选项类型     在 F# 中,泛型类型本质上与 C# 中的泛型类相同,用来写更通用和可重用的类型。在选项类型的情况下,我们已经看到此需要,因为,我们希望能够使用完全相同的泛型类型,创建选项,一个值可以携带不同类型。当然,我们要写类型安全的代码,因此,我们需要知道这个选项类型到携带了哪种类型。     正如在 C# 中,我们声明类型,有一个类型参数,作为值类型使用,保存在 Some 可选值中。可以在 F# Interactive 中输入代码,但如果这样做,将不得不重新启动它,

2011-04-27 15:25:00 494

翻译 5.4.1 在 C# 中实现选项类型

5.4.1 在 C# 中实现选项类型       正如我们所看到的,在函数的编程中,选项类型是很重要的,我们也希望能够在 C# 中用函数风格代码,因此,需要选项类型的适当 C# 实现。我们已经讨论了如何在面向对象的语言中对差别联合进行编码,因此,该代码的结构类似于我们刚才讨论过的计划类型。在Option 情况下,我们可以创建有 HasValue 属性的单个类(或值类型),有点简单。然而,我们想要演示在一般情况下,差别联合的编码概念,所以,我们将创建一个基类,Option,有 Tag 属性,并为两个可能的

2011-04-26 13:23:00 665

翻译 5.4 泛型值

5.4 泛型值       在本节中,我们将讨论有关泛型类型声明,你会看到在很多方面,F# 中的泛型类型类似于 C# 中的泛型类型。到目前为止,我们只看到一种类型声明——差别联合,用这种类型结构声明过。我们在后面将会看到其他类型声明,可以使用相同的结构来写(特别是,在第 7 和 9 章),但使之泛型的语法是与我们现在就要看到的语法完全相同。    不需要事先声明的类型,比如,元组,自然是泛型。我们可以使用类型的构造函数,有任何其他类型,比如, int  * int,或 string * int。当创建

2011-04-24 16:19:00 341

翻译 5.3.4 F# 中使用选项(option)类型

5.3.4 F# 中使用选项(option)类型       我们常常需要描述这样的理念,某些计算可能会返回未定义的值。在 C# 中,通常用返回 null(空值)实现。不幸的是,使用 null 频繁导致错误:可能轻松地编写代码,假定方法不返回空,当这种假设是错误的,可以看到臭名昭著的 NullReference 异常。当然,正确编写的代码始终检查 null 值在适当的情况下, 当编写应用程序的单元测试,大量的试验验证和在边界情况下。     在 F# 中,空值的使用最小化,它通常只用于与 .NE

2011-04-24 14:43:00 598

翻译 5.3.3添加类型还是函数

5.3.3 添加类型还是函数       正如我们早先提到过的,在 F# 和 C# 中,函数 Schedule 数据类型在一个方向不可扩展:很难添加一个新的事件的类型。在 F# 中,出现困难的原因是,需要修改类型声明;如果它在一个共享库中,必须重新编译这个共享库。同样,在 C# 版本中,我们有一个 Tag 属性,这使得添加新类型更困难。另一方面,这种设计的好处是,使我们能够很容易地添加新的功能,使用计划。     让我们研究一下函数和面向对象解决方案之间的差异。图 5.2 显示两个类层次结构表示两种可

2011-04-21 10:51:00 385

翻译 5.3.2 使用可选值

5.3.2 使用可选值       到目前为止,我们已经看到如何声明差别联合类型,以及如何使用识别器创建值。现在,我们将学习如何编写代码,读取值。看过之后F# 示例之后,我们将在 C# 中实现相同的代码,使用我们前面提到过的 Tag 属性的表示形式。   在 F# 中匹配差别联合       当使用差别联合时,我们总是要为所有可能的选项编写代码,因为,我们不知道这个值到底表示哪一个。加快一下早先的类似情况, 我们必须测试列表是空列表。还是 cons cell。我们使用模式匹配来完成此操作:mat

2011-04-19 17:24:00 386

翻译 5.3.1 F# 中的差别联合

5.3.1 F# 中的差别联合       像这种突然出现的类型在函数编程中相当频繁,所以,函数语言倾向于使创建和使用类型更方便。在 F# 中,这种支持功能称为差别联合(discriminated unions)。与元组不同,差别联合必须事先声明,因为,在我们可以创建表示计划的值之前,性质声明这个类型,要有名字,最重要的是,要有它能够表示的选项。清单 5.3 显示了在 F# 中表示计划的类型。 Listing 5.3 Schedule type using discriminated unio

2011-04-18 17:28:00 450

翻译 5.3 可选值

5.3 可选值       在上一节中,我们看了如何创建值,可以将多个值组合成一个。例如,我们取一个字符串值,和一个数字值,并创建一个复合值,包含一个字符串和一个数字。在本节中,你将看到如何构造一个值,它既可以包含字符串,也可以是数字。     首先,让我们看一个示例,看什么时候,它可能是有用的。想象一下,我们正在写计划任务和会议应用程序,想要有几种方法指定日历。对于只发生一次的事件,我们想保存日期和时间。我们还希望允许重复发生的事件。对于这种类型的事件,需要保存开始发生的日期和时间,重复的事件之间的

2011-04-18 13:57:00 451

翻译 5.2.3 组分使用元组

5.2.3 组分使用元组       当考虑从函数应返回什么样的元组时,关注的主要问题是可组合性(compositionally)。你期望如何使用元组?其他函数可以使用相同类型的元组吗?这符合与其余程序中的类似情况吗?     让我们使用一个示例来演示。我们将使用两种的方法,来表示以前的示例中的屏幕坐标和消息,假定已经有一个函数,打印消息。我们会省略这个实现,但是,函数 printMessage 的声明可能像这样:   > let printMessage (x, y) message =

2011-04-18 10:53:00 445

翻译 5.2.2 元组类型和值构造函数

5.2.2 元组类型和值构造函数       你已经知道元组值的类型是什么样子,我们在清单 5.1再次看到它。写类型使用星号,例如,元组类型存储整数和字符串,写成 int * string。在介绍这一章中,谈论值和类型,我们解释过一种类型是所有可能值的域。让我们使用这种观点,看一下元组类型:这种表示法如何反映由几个基本类型组成元组类型的事实?     在这种表示法中,星号发挥着关键作用,因为,它可以作为类型构造函数 (type constructor)[1]。这意味着,你可以使用星号来从任何其他类型构

2011-04-17 19:06:00 425

翻译 5.2.1 F# 和 C# 中的多值

5.2.1 F# 和 C# 中的多值       我们在第三章讨论元组时,用 C# 实现了一个 Tuple 类,与 F# 中的元组有相同的行为。使用元组不是从 C# 中的方法中返回多值的通常做法,你仍会发现,以函数方式写代码还是有用的。如果想在 C# 中写这个,而不使用元组,或者为每一个返回多值的方法声明一个新的类,你可能使用 out 参数。可以在清单 5.1 中看到这两种方法,这里,我们实现一个简单的函数程序,有余数的除法。   Listing 5.1 Division with a remain

2011-04-17 10:26:00 638

翻译 5.2 多值

5.2 多值       我们说过,一个函数返回多值,是使用元组的主要动机。也已经看到,也被用于把几个值组合到函数的单个参数值。这可以使代码更可读,更可组合,我们马上就会看到。

2011-04-16 18:46:00 339

翻译 5.1.2 认识值和数据

5.1.2 认识值和数据       值通常用于局部,在任何时候,都需要先创建再使用。我们说过,元组是经常使用的复合值之一。另一个例子是,我们将在 5.3.4 节讨论的 option 类型。它包括两种选择:一个是实际值,另一个指定了值为空时的值。当使用的选项值时,如果我们没有检查这两种情况,编译器会警告,没有得到 NullReferenceException 的危险。     值通常用于解决一般的编程任务,如表示缺少一些参数值。它们也可以是很简单的(局部使用)的实用程序,比如,值既可能包含一个 ID,

2011-04-16 17:57:00 365

翻译 5.1.1 基本类型、值类型和对象

5.1.1 基本类型、值类型和对象       在 C# 中,我们可以使用基本值类型(例如,整数或字符),自定义值类型,用struct 关键字声明(例如,日期时间),和类。值类型和引用类型差别主要是基于它们的行为,但是,最显著的是,类是可变的。例如,字符串看起来像值类型,实际是引用类型,因为它是不可变的,意味着,只要通过使用不可变类型,我们几乎可以消除值和引用类型之间的差异。只在性能上有差别,行为是相同的。     我们还可以看到类型的复杂性。在 C# 中,这种区别并不是那么明显,因为,即使基本类型是

2011-04-15 15:55:00 422

翻译 5.1 什么是值?

5.1 什么是值?     在我们看如何创建值以及如何使用值来控制程序流之前,要讲清楚什么是值。但是,没有简单的定义,所以,要理解的最好办法就是阅读本章。这一节要区分值和数据,并解释函数语言中的值如何与像 C# 语言中基本类型、值类型、对象相关。

2011-04-15 14:02:00 415

翻译 5 使用局部函数值

5 使用局部函数值   本章介绍 ■ 认识值的角色 ■ 用差别联合表示值 ■ 使用泛类型和类型推断 ■ 使用 lambda 语法创建函数     这一章讨论值(values)。它是一个术语,用于很多不同的编程语言,因此,我们应该首先定义我们的意思。当我们讨论函数编程的概念时,将函数程序描述有输入,并返回结果的计算。简单来说,值既可以用作 输入,也可以接收作为结果。这意味着,在你实现的计算的内部,所使用的一切都是值。     当编写一个执行计算的函数,我们可以把所有输入

2011-04-15 10:10:00 342

翻译 第二部分 基本的函数技术

第二部分 基本的函数技术       在本书的开始,我们说过函数编程建立在非常不同基础之上的,超过你过去用过的。读后第一部分以后,你应该对如何生成程序有了一些概念,使用原则,如不可变性和递归。我们还看到基本类型,如元组和列表,用来编写我们第一个较大的函数应用程序。现在,知道函数的概念结如何合在一起,我们可以更系统地看一下由 F# 和其他函数语言提供的基本构造块。     F# 中,往往从尝试使用最基本的函数特性开始。这种方式,可以快速获得可以工作的代码,并尝试不同的方法,以选择最佳的解决方案。在第二部

2011-04-14 14:49:00 289

翻译 4.5 第四章小结

4.5 第四章小结     在这一章中,我们开发了一个简单但实用的应用程序,绘制饼图。我们讨论了基本的 F# 和 .NET 的数字数据类型,探讨了 F# 和 .NET 两个使用字符串的函数。此外,我们还演示了如何从 F# 中使用普通的 .NET 库,也看到了使用 Windows Forms,System.Drawing 以及基本的 I/O 的例子。    我们想在这一章中演示的是一个典

2011-04-13 20:00:00 302

翻译 4.4.3 创建 Windows 应用程序

4.4.3 创建 Windows 应用程序     我们早先开始创建了应用程序的图形用户界面较早前,所以,已经创建了用户界面的控件的代码。不过,仍要为控件指定用户交互逻辑。    用户可以使用两个按钮控制应用程序。第一个 (btnOpen) 加载 CSV 文件,第二个(btnSave)将图表保存到图像文件中。我们还有一个 PictureBox 控件 boxChart,这用来在其中显示图

2011-04-13 16:40:00 366

翻译 4.4.2 绘制图形

4.4.2 绘制图形     应用程序绘制饼图分两步:绘制填充的饼图,添加文本标签。这种方式,可以肯定的是,标签不会被饼图覆盖。     执行绘图代码的很大一部分可以被这两个步骤共享。对于每一步,我们需要迭代列表中的所有项目,计算饼图中占的角度。解决这个问题的办法是编写一个函数,执行共享的操作,取绘图函数作为参数值。该代码调用此函数两次。第一步中的绘图函数填充饼图部分,在第二步中的函数绘制文本标签。   创建随机颜色的画笔       让我们首先绘制这个饼形。我们想要使用随机的颜色填充的饼

2011-04-12 11:34:00 610

翻译 4.4.1 创建用户界面

4.4.1 创建用户界面     这一章中,我们使用 Windows Forms,它在很多方面更简单,但从 F# 中使用其他技术不应该成为你的问题。在 Windows Forms 中的用户界面使用组件构建 (如Form, Button, or PictureBox),因此,我们要首先要编写生成用户界面控件的代码。此任务可以通过使用图形设计器进行简化,但我们的应用程序很简单,所以,我们就手工编写代码。在一些 UI 框架(包括 WPF)中,控件的结构,可以用基于 XML 的文件描述,但在 Windows Fo

2011-04-11 17:22:00 512

翻译 4.4 创建 Windows Forms 应用程序

4.4 创建 Windows Forms 应用程序     Windows Forms 是一种标准的库,用于开发 Windows  GUI 应用程序,与来自 System.Drawing 命名空间的功能很好地集成。这两个库除其他事项外,允许我们在屏幕上绘制并显示图形。.NET 的生态系统是相当丰富的,因此,我们也能使用其他技术。可以使用 Windows Presentation Found

2011-04-11 14:48:00 332

翻译 4.3 创建控制台应用程序

4.3 创建控制台应用程序     为我们的应用程序编写一个简单的基于控制台输出,是一个好的开始,因为这做起来相对容易,并且很快看到结果。在本节中,我们将使用的几个技术,在稍后的图形版本中也很重要。即使应用程序不需要基于控制台的输出,仍可以把它作为起点,到后来把它改编成更高级的图形化的版本。在这一章中,我们就要这样做。     在上一节,我们已经完成了大部分程序,通过编写通用的泛函数,由控制台和图形版本共享。有一个函数 processLines,取从 CSV 文件加载的字符串的列表,返回解析为元组

2011-04-11 11:38:00 490

翻译 4.2.2 计算数据

4.2.2 计算数据       在这个应用程序的第一个版本中,我们将只打印标签,以及图表中每个项目所占比例(百分比)。     若要计算百分比,就需要知道列表中所有项目数值总和。在清单 4.4 中的函数 calculateSum 来计算此值。   Listing 4.4 Calculating a sum of numeric values in the list (F# Interactive) > let rec calculateSum(rows) = match rows w

2011-04-08 11:21:00 427

翻译 4.2.1 加载和解析数据

4.2.1 加载和解析数据     作为第一步,我们将实现一个函数 convertDataRow,它从这个 CSV 文件中取一行作为字符串,从这一行中返回两个组件到一个元组中。实现这个函数后,立刻测试它,通过给它一个示例输入 (字符串“Testing reading,1234”),应该能正确解析。在清单 4.2 中,可以这个函数的代码和测试的结果。Listing 4.2 Parsing

2011-04-06 17:16:00 370

翻译 4.2 用 FSI 编写和测试代码

4.2 用 FSI 编写和测试代码     从 4.1 节的描述中,你应该了解我们将使用什么样的数据。这个应用程序使用一系列元素,包含显示在图表上的标题和数字。将从简单的 CSV 文件中加载数据,其中每行包含单个元素。清单 4.1 显示一个示例文件,有世界的人口分布,单位以百万计。 Listing 4.1 Our CSV file with population informati

2011-04-06 16:34:00 431

翻译 4.1 用 F# 绘制饼图

4.1 用 F# 绘制饼图       我们将开发一个绘制饼图的应用程序,如图 1 所示。这个应用程序从 CSV 文件(逗号分隔型取值格式,Comma Separated Values)中加载数据,并执行预处理,为了计算数据源中的每个项的百分比。然后,绘制 图表,允许用户以位图格式保存图表文件。我们可以使用库来显示图表(会在第 13 章完成),但,由我们自己来实现这个功能,还将从 F# 代码中学习许多有关 F# 编程和使用 .NET 库的内容。     我们分三个部分实现这个应用程序:     ■

2011-04-06 16:10:00 504

翻译 4 通过示例探索 F# 和 .NET 库

4 通过示例探索 F# 和 .NET 库   本章介绍 ■ 使用通用 .NET 和 F# 库 ■ 实现第一个 F# 实用程序 ■ 用 F# Interactive 开发代码 ■ 从文件加载数据并绘制图表         到目前为止,跃然我们只学习了最基本的 F# 语言功能,但是,写一个简单的应用程序已经足够了。在这一章中,我们不引入任何新的函数语言结构,而主要讨论用 F# 开发 .NET 应用程序的实际问题。你可能知道如何用 C# 编写类似的应用程序,因此,在这一章中的所有代码都使用 F#

2011-04-06 10:41:00 546

原创 现实世界的函数编程:有F#和C#示例

现实世界的函数编程:有 F# 和 C# 示例     原书地址: http://hadstj.blog.hexun.com/60717138_d.html     全书分成四部分,共十六章: 第一部分:学习函数思维 http://hadstj.blog.hexun.com/62192678_d.html   第一章 不同的思维     http://hadstj.blog.hexun.com/62197932_d.html     1.1 什么是函数编程 http://hadstj.blog.

2011-04-05 20:05:00 728

翻译 3.5 第三章小结

3.5 第三章小结     在这一章中,我们探讨了基本的函数结构和技术,在实践中的。首先,用 let 绑定声明值和函数,学习了 F# 如何使要用到的概念的数量最小化——从严格的数学观点来看,不可变的值就是一个不带参数值的函数。    接下来,我们看了函数语言中最简单的不可变的数据结构:元组。我们用它来演示如何使用不可变的数据结构。当对不可变的数据结构进行计算时,不能修改已有的实例,但可

2011-04-05 19:24:00 455

翻译 3.4.2 参数化函数的好处

3.4.2 参数化函数的好处     让我们看一个另外的示例,为了另一个目的而使用此函数——乍一看起来,与加或乘列表中的元素的诗篇同。让我们看看,是否能算出最大值: > aggregateList max (-1) [ 4; 1; 5; 2; 8; 3 ];; val it : int = 8     这个函数的第一个参数值(max),是内置的 F# 函数,从给定的两个

2011-04-05 14:20:00 660

翻译 3.4.1 处理数字列表

3.4.1 处理数字列表     假设我们想写一个类似于 SumList 的方法,只是把加法改成乘法。此更改看起来很简单:我们可以复制 SumList 方法,然后修改它。在修改的方法中只有两个变化: int MultiplyList(FuncListint> numbers) { if (numbers.IsEmpty) return 1; else return numb

2011-04-05 13:49:00 669

翻译 3.4 函数也是值

3.4 函数也是值     在前一节中,我们谈到不可变列表,学习了如何编写函数递归地处理列表。在本节中,我们将看到另一个更重要的函数编程的概念:函数看为值。你将看到为什么这是如此有用,使用这种方式使用函数,以及把函数看为值是什么意思。有关函数的详细信息将在第 5 章介绍。

2011-04-03 14:17:00 332

翻译 3.3.4 处理函数式列表

3.3.4 处理函数式列表       到目前为止,我们已经讨论了函数式列表类型的外表特征,以及如何在 C# 中实现。现在是时候编写一些实际的代码使用函数式编程。例如,我们要在 C# 中实现一种方法 SumList(或 F # 中的 sumList 函数),对列表中的数求和。   用 C# 求和列表       如果您习惯于在 C# 中使用命令式编程,并使用过标准的 .NET 数组或来自 System.Collections.Generic 的 List 类,或许会创建一个变量 total,并初始化为零,写

2011-04-03 12:11:00 428

翻译 3.3.2 介绍函数式列表

3.3.2 介绍函数式列表     现在,使用递归的一般原则更舒适,那我们就详细地看看函数式列表。刚才我们提到过,列表既可以是空的,也可以由一个元素与另一个列表组成。这意味着,我们需要一个特殊的值来表示空的列表,还有一种构建列表的方法,通过取一个现有列表,并在它的前面加上一个元素。第一个选项(空列表)有时称为 nil,第二个选项产生 cons cell(是构造的列表单元格缩写,constr

2011-04-02 15:52:00 598

翻译 3.3.3 C# 中的函数式列表

3.3.3 C# 中的函数式列表     若要显示函数式列表类型是如何工作的,让我们看看如何在 C# 中可以实现相同的功能。有几种方法来表示这一事实,列表既可以是空的,也可以是有头和尾。面向对象的解决方案将写入抽象类 FuncList,有两个派生类来表示这两种情况——例如,EmptyList 和 ConsCellList。为使代码尽可能简单,我们只使用一个单类,有个属性 IsEmpty,它

2011-04-02 12:15:00 676

原创 配置 SharePoint Kerberos

配置 SharePoint KerberosSharepoint 支持 NTLM 和 Kerberos 两种验证协议: NTLM 默认设置(NTLM 协议)基于一种“提问 - 答复”机制来进行客户端验证。SharePoint 产品中提供了 NTLM,以便与只能使用 NTLM 验证的系统进行通信。协商 (Kerberos) Kerberos V5 协议是用于域内验证的主要安全协议

2011-04-01 20:20:00 1503

SQL.Server.2012.Integration.Services-2

SQL.Server.2012.Integration.Services

2012-04-20

SQL.Server.2012.Integration.Services

SQL.Server.2012.Integration.Services

2012-04-20

SQL.Server.2012.Administration-2

SQL.Server.2012.Administration

2012-04-20

SQL.Server.2012.Administration

SQL.Server.2012.Administration

2012-04-20

jQuery.1.4.Reference.Guide

jQuery.1.4.Reference.Guide

2010-02-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除