F#基础
文章平均质量分 73
心想才事成
这个作者很懒,什么都没留下…
展开
-
线程、内存、锁定和阻塞(Threads, Memory, Locking, and Blocking)
线程、内存、锁定和阻塞(Threads, Memory, Locking, and Blocking) 如果你真的想进行并行编程的话,花点时间理解线程和内存的概念是完全值得的。在这一节,我们将学习如何显式地创建线程,并控制对共享资源,比如内存的访问。我的忠告是,应该避免你这样显式创建和管理线程,然而,在使用其他的并行编程方法时,理解底层的线程概念是需要的。程序运行时,操作系统会创建一个翻译 2014-05-12 15:30:28 · 4801 阅读 · 0 评论 -
使用 HTTP
使用 HTTPWeb 使用超文本传输协议(Hypertext Transfer Protocol,HTTP)通信,通常用 web 浏览器,但是,出于某些原因,也可能想用脚本或程序中发出 web 请求,例如,通过 RSS 或 Atom feeds 收集站点内容。生成 HTTP 请求,需要用 System.Net.WebRequest 类的静态方法 Create。它创建 WebRequ翻译 2014-05-21 16:24:48 · 1416 阅读 · 0 评论 -
调用 COM 对象
调用 COM 对象大多数 Windows 程序员都熟悉组件对象模型(Component Object Model,COM)。在某程度上,.NET 框架 就是为了替换 COM,但是,系统仍然保留了这个功能,可能就是为了我们的不时之需。Windows 中许多编程接口都公开为 COM 对象,虽然,现在越来越多地有了 .NET 框架等效的可托管对象,但仍有一些并没有等效的可托管对象;另外,还有翻译 2014-06-23 16:41:25 · 1645 阅读 · 0 评论 -
定义类和接口
定义类和接口 在 F# 中,有两种方式为函数和类的成员定义参数:“curried”风格,成员可以散(partially)应用,“元组(tuple)”风格,所有成员都必须一次给定。定义类时,如使用元组风格,C# 客户端可以更容易使用这样的类。看下面的例子,在 F# 中定义一个类,其中有一个curried 风格定义的成员CurriedStyle,还有一个元组风格的TupleStyle。翻译 2014-06-23 14:37:16 · 1593 阅读 · 0 评论 -
使用 HTTP Post
使用 HTTP Post 我们已经看过使用HTTP 协议检索数据的两种不同方法,下面,我们将学习如何使用上HTTP 进行更新。为了能够让客户端发送数据,HTTP协议提供了POST 动词,它把客户端发送数据作为 HTTP 请求体的一部分。下一步是使用流行的社交网络工具推特进行状态更新,地址:http://twitter.com(见清单 11-5)。 清单 11-5 使用 HTTP翻译 2014-05-22 11:35:51 · 1310 阅读 · 0 评论 -
使用 HTTP 访问谷歌的电子数据
使用 HTTP 访问谷歌的电子数据 由于通过 HTTP 和 XML 公开数据的简单和平台无关性,因此,成为了互联网上公开数据最流行的方法之一,只需要使用 HTTP 和部分 XML 处理,就可以访问数量大得惊人的数据。访问谷歌自己公布的电子数据就是一个很好的应用,在清单 11-4 中我们可以看到如何访问谷歌的电子数据。 注意我们将要访问的电子数据来自卫报数据商店(Guardian翻译 2014-05-22 09:15:23 · 1084 阅读 · 0 评论 -
异步使用 HTTP
异步使用 HTTP 到现在,我们所关注的还只是通过 HTTP 一次检索一个文档,或进行一次更新,在这种情况下,使用异步编程模式就没什么意义了。然而,我们通常的想法是一次能进行多个 HTTP 请求,这样,就可以从多个源检索、汇总数据,在这种情况下,使用 F# 的异步工作流,我们第一次碰到是在第十章“异步编程”一节,就能极大提高应用程序的性能。事实上,我们可能还希望能得到比使用本地磁盘更高的性翻译 2014-05-22 17:28:22 · 2497 阅读 · 0 评论 -
编译抽象语法树
编译抽象语法树 对大多数开发人员来说,编译就意谓着产生本地代码,给人感觉就是一个字,难。但是,并不一定要产生本地代码,对于 DSL,通常产生其他更加通用的编程语言。.NET 框架提供几个把抽象语法树编译成程序的功能。技术的选择取决于几个因素。例如,如果语言针对的是开发人员,那么,生成文本文件就足够了,内容可以是 F#,也可以是其他语言,或者是编译过的程序集,能在程序中使用;然而,如果针翻译 2014-06-06 15:35:12 · 4220 阅读 · 0 评论 -
承载(Host)通用语言运行时
承载(Host)通用语言运行时(CLR) 另一种使用COM 的方法是是把需要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起,开成自定义的承载通用语言运行时,通用语言运行时就是 C++ 应用程序,且有一些可用的库(.lib)文件,可以在标准的 C++ 应用程序中链接它。承载通用语言运行时的代码要比加载 COM 库的代码稍许复杂一点,但不需要复杂的注册 COM 库了;这个方法还可能翻译 2014-06-26 11:34:12 · 1864 阅读 · 0 评论 -
解释抽象语法树
解释抽象语法树 创建了抽象语法树之后,有两个选择:解释或编译。解释,简单地说,就是遍历树,同时执行操作;编译,就是改变成其他形式,对于机器执行来说可能更简单,通常可能更快。这一小节先讨论如何解释结果,下面一小节再讨论编译的内容,最后,再讨论何时应该用解释,何时应该用编译的问题。下面的例子是一个很小解释器,解释抽象语法树的主要工作由函数interpret 完成,它遍历树,并同时执行需要的翻译 2014-06-04 14:28:13 · 4213 阅读 · 0 评论 -
使用内联中间语言
使用内联中间语言(Inline IL) 内联中间语言(Inline IL)能够直接在中间语言(intermediate language,IL)中定义函数体,中间语言是 F# 编译后的语言,它主要为语言添加了实现特定低级运算符和函数,比如,加法和box 和 not 的功能。我们很少会用到这个功能,因为F# 库FSharp.Core.dll 已经公开了所有的、可能需要的生成中间语言的功能。然翻译 2014-06-24 16:27:28 · 1072 阅读 · 0 评论 -
使用 COM 风格的编程接口
使用COM 风格的编程接口 如果不直接使用 COM 库,不创建自己的包装,那么更可能的是使用 COM 风格的编程接口。这是因为现在许多开发商发布应用程序时,提供了首选的互操作程序集(Primary Interop Assemblies),这是预先创建的 COM 包装,因此,我们就不需要再自己考虑用 TlbImp.exe 来创建包装了。 注意更多有关首选的互操作程序集的内容,可以翻译 2014-06-24 09:15:41 · 1103 阅读 · 0 评论 -
第十章 并行编程
第十章并行编程 最近并行编程(parallel programming)已经不再是相对较晦涩的主题,由只能是专业开发人员精通,变得更为主流,这是因为日益流行多核处理器。在写作本书的时候,想买一台单核处理器 PC 机,已经几乎不可能,双核已是标配,四核处理器也开始出售,而未来几年内这种趋势还将继续完全在意料之中。在某些程度上,并行编程中的这种兴趣在带动了函数编程的新的兴趣。函数式编程当然翻译 2014-05-12 10:38:41 · 939 阅读 · 0 评论 -
响应式编程(Reactive programming)
响应式编程(Reactive programming) 响应式编程是指确保程序对事件或输入做出响应的做法。在这一节,我们将专注于图形界面方面的响应式编程,图形界面总量响应式的。然而,其他网格的编程也需要考虑响应式编程,例如,运行在服务器上的程序总是需要保持对输入作出响应,即使是在它处理其他需要长时间运行的任务期间。我们将在第十一章实现聊天服务器时,会看到在服务器编程方面也要用到这里讨论的一翻译 2014-05-13 10:56:07 · 10298 阅读 · 0 评论 -
使用 TCP / IP 套接字(Sockets)
使用TCP / IP 套接字(Sockets) TCP/IP 套接字提供了跨网络的低层控制。TCP/IP套接字是两台计算机之间的逻辑连接,通过它,计算机能够在任何时间发送或接收数据;这个连接一直保持,直到这台计算机显式发出关闭指令。它提供了高度的灵活性,但也带来了大量的问题,在这一章中我们会看到,因此,除非真的需要非常高度的控制,否则,最好还是使用更抽象的网络协议,在这一章的后面我们也会谈翻译 2014-05-20 16:16:24 · 2806 阅读 · 0 评论 -
第十一章 分布式应用程序
第十一章分布式应用程序 使用网络的应用程序,称为分布式应用程序(distributed applications),现在,已经越来越重要。幸运的是,.NETBCL 和其他的库提供了许多结构,使得通过网络通信变得容易,进而,用 F# 创建分布式应用程序也是很简单。 网络概述 已有几类分布式应用程序,通常分为:客户端-服务器(client-server)应用程序,其中客户翻译 2014-05-19 15:12:42 · 1695 阅读 · 0 评论 -
数据并行(Data Parallelism)
数据并行(Data Parallelism) 数据并行,不同的数据输入以并行方式运行同一个函数,它把一个任务分解成不连续的单元,因此,可以在单独的线程上并行处理,保证这个任务可以在可用的处理之间进行分配。通常是处理数据集合,这种方法利用了集合中的项目自然提供了任务分配。最简单的情况,是一个并行的映射函数,对集合的中每一项应用一个转换,结果形成一个新的集合。这种简单的情况通常是可以工作的翻译 2014-05-14 11:10:59 · 10557 阅读 · 0 评论 -
基于引用的元编程(Metaprogramming with Quotations)
基于引用的元编程(Metaprogramming with Quotations) 在第六章,我们使用过引用(quotations),它们是被引用的 F# 代码段,引用运算符指示编译器生成表示代码的数据结构,而不是表示代码的中间语言(IL)。即,生成了表示代码的数据结构,而不是可执行代码,这样,就可以很方便地用它做你想做的事情。可以解释,执行一些动作,也可以编译成另一种语言,或者,干脆忽略翻译 2014-06-03 14:59:50 · 1749 阅读 · 0 评论 -
抽象语法树(Abstract Syntax Tree)
抽象语法树(Abstract Syntax Tree) 抽象语法树(AST)表示组成程序的结构,可以让程序员更容易使用,F# 适宜这种开发的一个原因就是它的联合类型。这种类型非常适合表示语言,因为它可以用来表示相关而结构不相同的项目。下面就是抽象语法树的例子: type Ast = | Ident of string | Val of System.Double翻译 2014-06-04 10:18:42 · 9162 阅读 · 0 评论 -
为算术语言(Arithmetic-Language)实现编译器和解释器
为算术语言(Arithmetic-Language)实现编译器和解释器 到目前,我们更注重的是语言本身的设计,即前端,没有涉及语言的编译器或解释器的实现,即后端。在这一节,我们将关注后端的实现,由抽象语法树(Abstract Syntax Tree,AST)定义的一种简单的算术语言。第一小节所展示的抽象语法树是基于联合类型的。在下一章“解析文本”,我们还要回到这个示例,来构建这种语言的翻译 2014-06-04 09:37:46 · 994 阅读 · 0 评论 -
创建网站服务(Web Services)
创建网站服务(Web Services) 网站服务(Web Services)是基于一些标准的(通常是 SOAP),使应用程序能够通过HTTP 交换数据。网站服务由网站方法(web methods)组成,公开这些方法,可以在网络上运行;某种程度上,可以把它看作是 F# 的函数,因为网站方法有名字,有参数,也返回结果,参数和结果用元数据(metadata)进行描述,网站服务把这些也都公开了,翻译 2014-05-23 20:52:47 · 1402 阅读 · 0 评论 -
在本机代码中通过 COM 使用 F#
在本机代码中通过COM 使用 F# 虽然大多数情况下,我们可能希望从 F# 代码调用本机代码,但是,在某些情况下,也可能想从本机代码中调用 F# 库函数。例如,假设我们有一个大型的程序是用 C++ 写的,有可能希望用户界面保持用 C++,而把一些逻辑,比如执行复杂数学计算的部分迁移到 F#,以方便维护。在这种情况下,我们就要从本机代码中调用 F# 了。简单的方法是借用.NET 提供的工具,翻译 2014-06-25 16:01:48 · 1254 阅读 · 0 评论 -
Windows 通信基础(Windows Communication Foundation)
Windows 通信基础(Windows Communication Foundation) Windows 通信框架(Windows Communication Framework,WCF)的目标是提供创建分布式应用程序的统一模型,其概念是创建一个服务,有点类似于网站服务,包含想要公开的功能,然后,以各种不同方法公开这个服务。例如,网站服务总是传递 XML 消息,但是,可以把 WCF翻译 2014-05-26 16:05:17 · 2100 阅读 · 0 评论 -
实现基于数据结构的语言
实现基于数据结构的语言 创建任何 DSL 都应该从定义需要解决的问题开始。这里,我们需要定义一个 DSL 库(有时也称为组合库,combinators library),用于二维图形,这是一个很明显的选择。这个示例演示如何用大量简单的基本图形构建出复杂的结构。在计算机屏幕上的图像本质上就是线条和多边形的集合,尽管显示出来的图形可能极其复杂。这个示例用四个模块表现:第一,清单 12-1,提供翻译 2014-05-30 15:09:19 · 1055 阅读 · 0 评论 -
使用解析器
使用解析器 使用解析器是非常简单,可以使用它自己的词法分析器,但是,用fsyacc.exe 产生的解析器总是要求词法分析器。在这一小节,我们将讨论如何使用自己的词法分析器,以及与解析器联合。 警告记住F# 编译器不能直接使用.fsl 和 .fsy 文件,需要用fslex.exe 和 fsyacc.exe 进行编译,创建.fs 文件,然后才能使用。通常,使用预编译事件实现,它在翻译 2014-06-16 08:58:23 · 1163 阅读 · 0 评论 -
FParsec 库
FParsec 库 FParsec 是一个开源的组合库,用于解析文本。可以从 http://www.quanttec.com/fparsec/ 下载,由 StephanTolksdorf 实现,是基于流行的Haskell 解析库 Parsec,http://www.haskell.org/haskellwiki/Parsec。这 是一个组合库的示例,其思想与我们在前一章所讨论的相似,解翻译 2014-06-18 11:33:18 · 1231 阅读 · 0 评论 -
第十四章 兼容性和高级互操作
第十四章 兼容性和高级互操作 在这一章,我们将学习F# 与其他语言进行互操作所需的内容,不仅包括在.NET 框架内,而且也包括从F# 中使用非托管代码,以及从非托管代码中使用 F#。 警告在本书中,我尽一切努力保证使你只需要了解 F#;然而,在这一章,虽然我一直保持代码对这些语言中的最低需求,但是,如果你知道一点 C#、 C++ 或 .NET Common IL 的内容,对你是翻译 2014-06-18 21:16:30 · 911 阅读 · 0 评论 -
公开的函数把函数作为参数
公开的函数把函数作为参数 如果想公开把其他的函数作为参数的函数,最好的方法是用委托(delegate)。考虑下面的例子,定义了两个函数,一个是公开函数,另一个把函数公开为委托。 module Strangelights.DemoModuleopen System /// a function that provides filteringlet filterStri翻译 2014-06-20 18:34:59 · 1770 阅读 · 0 评论 -
使用联合类型
使用联合类型 可以在 C# 中使用联合类型,但是,由于 C# 没有真正意义上的联合类型,因此,在 C# 中使用看上去不漂亮。在这一节,我们将讨论如何在 C# 中使用联合类型,以及作为库设计人员,如何可以决定库是否公开联合类型(虽然,我个人建议避免跨语言公开联合类型)。第一个例子,我们定义了一个简单的联合类型Quantity,它有两个构造函数,一个包含整数,另一个包含浮点数;还提供一个函翻译 2014-06-22 17:30:38 · 2171 阅读 · 0 评论 -
使用 F# 列表
使用 F# 列表 在 C# 中使用 F# 的列表,是完全可能的,但是,我建议不要用,因为,只要再做一点,就会使事情在 C# 看来更加自然。例如,把列表转换成数组很简单,用List.toArray 函数;转换成System.Collections.Generic.List,用 new ResizeArray()构造函数;转换成System.Collections.Generic.IEnume翻译 2014-06-22 17:56:15 · 1135 阅读 · 0 评论 -
返回元组
返回元组首先,我们讨论为什么应该避免使用元组。如果函数返回元组,用户就必须引用 FSharp.Core.dll;另外,需要使用元组的代码C# 中看并不好。考虑下面的例子,我们定义了函数 hourAndMinute,它从结构 DateTime 中返回时、分。#lightmodule Strangelights.DemoModuleopen System/翻译 2014-06-20 16:03:43 · 1859 阅读 · 0 评论 -
生成解析器:Fsyacc
生成解析器:Fsyacc 扫描器就是一段程序或模块,把文本流拆成片断,解析器可以看作是把文本重新组织为更有意义的内容。解析器的目标通常是产生抽象语法树,通过定义规则,确定符号应该出现的顺序。工具fsyacc.exe 生成的解析器,是向前看从左到右(look-ahead left-to-right)的解析器,通常称为 LALR(1)[ 好像解释的有点问题,下面的内容来自百度百科 LR 分析法翻译 2014-06-13 14:38:31 · 1186 阅读 · 0 评论 -
文本符号化:Fslex
文本符号化:Fslex 文本符号化(Tokenizing,有时也叫词法分析,lexical analysis 或 lexing),其基本意思是把文本分成可管理的块(lump),或符号(token)。要用到工具fslex.exe,它本身就是创建词法分析器(有时也叫扫描器,scanner),进行文本符号化的程序或模块的特定域语言。fslex.exe 是命令行程序,接收参数是表示词法分析器的文本翻译 2014-06-12 11:05:45 · 1929 阅读 · 0 评论 -
第十二章 面向语言编程
第十二章 面向语言编程 在这一章,首先了解什么是面向语言的编程(language-oriented programming),许多人都在用,定义也各不相同。我们将主要讨论它的优点、不足;然后,再看F# 中面向语言编程的几种不同方法,这些方法包括使用 F# 文字创建“小语言”(little languages),使用 F# 引用(quotations),本章的大部分将讨论创建一种语言的示例,翻译 2014-05-28 10:16:56 · 1141 阅读 · 0 评论 -
编译还是解释?
编译还是解释? 我们可能要问,什么时候应该用编译,什么时候应该用解释呢?最终的结果是几乎相同,因此,答案通常最终归结为生成代码的原始速度,虽然内存使用情况和启动时间也是主要的关注。如果需要代码执行得更快,那么编译通常是更好的结果,有一定的优势。清单 12-8 的测试工具,能够重复执行 interpret 函数中的 createDynamicMethod 方法,计算出花费的时间;还测试在翻译 2014-06-09 14:35:51 · 1125 阅读 · 0 评论 -
解析逗号分隔文本
解析逗号分隔文本 在这一节,我将考虑两种简单的方法解析逗号分隔文本。逗号分隔(comma separated values,CSV)格式,是以文本格式保存数据的一种方法,逗号用于界定保存在每一列中的值,它是一种最古老的文本格式,在 PC 还没有标准规范的时代就已经在使用了。逗号分隔文本真正复杂的是处理转义字符,以及列中包含逗号。在这种情况下,需要考虑如何解码列,使它不会产生新列。然而,我们翻译 2014-06-10 16:13:19 · 2722 阅读 · 0 评论 -
第十三章 解析文本
第十三章解析文本 结构化的文本格式,对我和机器来说,都具有可读性,在计算机界几乎从开始就流行,编程语言就是一个很好的示例,当然还有其他许多应用。解析文本,与前面一章“面向语言编程”是相关联的,因为,如果想要实现一种语言,不嵌入在 F# 中,那么,第一步就是要为这种格式创建解析器。然而,解析已有文本格式是有许多原因的,因此,,没有把它限制在解析语言这一章中。[ 也是这一章从原来第十二章中分出翻译 2014-06-09 17:05:30 · 930 阅读 · 0 评论 -
托管 WCF 服务
托管 WCF 服务 WCF 中,最让我感到兴奋的方面是它可以把服务托管在任意程序中,而不一定是网站服务器。这开启了一种可能性,即创建的服务,其实现可以动态改变的能力,因为它们能够托管在 fsi.exe。为了使前面的示例能够运行在 fsi.exe,还需要对它做一些修改,但修改相当简单。清单 11-13 展示了清单 11-9修改后的版本,它能够运行在 fsi.exe。 清单 1翻译 2014-05-27 15:08:25 · 1859 阅读 · 0 评论 -
F# 基础
F# 基础再译《F# 基础》序前言第一章 什么是函数编程 函数编程为啥重要 什么是 F# 谁在用F# 谁能读本书第二章 获得、安装、使用 F#第三章 函数编程(一) 文字、函数、标识符、标识符的命名、作用域、轻量语法第三章函数编程(二) 捕获标识符、use翻译 2014-03-03 19:38:36 · 3012 阅读 · 0 评论 -
语言定义的其他示例
语言定义的其他示例 在本章的以后部分,我们会看到有关如何解析简单的算术语言的两个扩展示例。第一个用fslex.exe 和 fsyacc.exe 实现,第二个用开源的解析库 FParsec。这种语言与前一章的非常相似,语言规范完全相同,有四则运算,只是不再使用连接符(combinator),语言本身有文字格式 *、+、/、- 来表示运算。扩展的巴氏范式(Extended Backus–Nau翻译 2014-06-11 14:27:58 · 1157 阅读 · 0 评论