摘要: 函数式编程(FP)是最古老的三大编程范式之一。 其他的函数式语言包括:1955年发明的IPL,1958年发明的Lisp,以及后期的SML, OCaml,Haskell, and Clean, among others等。F#语法与OCaml和Haskell最接近。 F#的巨大优势之一是,您可以使用多个范式并组合成最便捷的方式来解决问题。 阅读全文
posted @ 2011-11-21 14:19 银河系漫游指南 阅读(862) 评论(0) 推荐(0) 编辑
摘要: 各位大虾,原文的pdf文档在这里下载。第一章 简介什么是函数式编程为什么函数式编程很重要什么是F#谁在使用F#谁需要这本书下一步是什么第二章 如何获取、安装和使用F#获取F#在windows上安装F#在Linux上安装F#使用F#的不同方式安装这本书使用的软件总结第三章 函数式编程标识符关键字直接量定值与函数范围递归匿名函数操作符列表列表概括控制流类型与类型推导模式匹配定义类型异常与异常处理惰性求值第四章 命令式编程基元类型mutable关键字定义mutable记录类型ref类型数组数组概括控制流在概括上的遍历调用.NET库的静态方法和属性使用.NET库的对象与方法使用.NET库的索引... 阅读全文
posted @ 2011-11-21 12:00 银河系漫游指南 阅读(1279) 评论(0) 推荐(0) 编辑
摘要: 目录灰度图文件解析PGM文件处理样板代码隐含状态在这一章,我们将讨论一个常见的任务:解析二进制文件。用着个例子有两个目的。第一个是介绍些解析的内容,但我们主要的目标是讨论如何组织程序,重构,和样板代码的去除。我们将演示如何清理重复的代码,并为第14章将要讨论的 Monad 打好基础。我们将要处理的文件格式来自netpbm软件包,它是一个古老并令人尊敬的程序库,包含了很多处理位图的程序和文件格式。这些文件格式具有应用广泛且解析非常简单的优点。对我们来说最方便的一点是netpbm文件没有被压缩。灰度图文件netpbm的灰度图文件格式名为 PGM (可移植灰度图)。其实它并不是一个格式,而是两个;“ 阅读全文
posted @ 2011-07-25 16:17 银河系漫游指南 阅读(1384) 评论(0) 推荐(0) 编辑
摘要: 自从计算机有了层次型文件系统以来,“我知道我有这个文件,但是我不知道它在哪”这个问题一直困扰着我们。1974年Unix第五版中引入了 find 命令,至今它依然不可或缺。计算机技术已经进展了很多,现代的操作系统附带了高级的文档索引和搜索能力。在程序员的工具箱中,find这样的能力依然占据有其价值的位置。在本章,我们将在Haskell中开发一个提供find的很多能力的程序库。我们将探索集中不同的方法来写这个库,每种具有不同的能力。如果你不使用Unix类的操作系统,或者并非重度的shell用户,很可能你并没有听说过find。给出目录列表,它会递归的搜索每一个目录,并输出匹配一个表达式的每一个项目的 阅读全文
posted @ 2011-07-25 16:15 银河系漫游指南 阅读(981) 评论(0) 推荐(0) 编辑
摘要: 高效文件处理这是一个简单的文件读取测试,读取一个全是数字的文本文件,输出它们的和。-- file: ch08/SumFile.hsmain = do contents <- getContents print (sumFile contents) where sumFile = sum . map read . words虽然String类型是读写文件时默认使用的,但是它的效率较低,因此这个简单的程序执行效率会很糟糕。String 用 Char值的列表表示; 列表上每个元素都是独立分配的,并且还有一些簿记的开销。要读写文本和二进制文件的程序,其内存占用和性能会受到这些因素影响。像这样简单 阅读全文
posted @ 2011-07-25 16:14 银河系漫游指南 阅读(2669) 评论(0) 推荐(0) 编辑
摘要: 几乎所有程序都是用来从外部世界收集数据,处理数据,并把处理结果返回给外部世界的。也就是说,输入和输出对于程序设计来说相当关键。Haskell的I/O系统很强大,表达能力很强也很容易使用,理解它的原理对于学习Haskell来说非常重要。Haskell把纯函数式代码和那些会对外部世界产生影响的代码严格区分了开来。也就是说它把副作用完全隔离在了纯函数式的代码之外。这样不仅可以帮助程序员更容易验证程序的正确性,也能让编译器自动进行优化和并行化。本章先从Haskell简单的标准I/O开始。然后我们再来讨论一些其他更强大的做法,以及更详细地探讨I/O是如何与纯粹、惰性、函数式的Haskell世界相融合的。 阅读全文
posted @ 2011-07-25 16:12 银河系漫游指南 阅读(3413) 评论(0) 推荐(0) 编辑
摘要: 类型类是Haskell中最强大的特性之一。它可以让你定义一个泛型接口,来给很多不同类型提供一个通用的特性集。类型类是一些语言基本特性如相等性测试和数字操作的核心。在讨论类型类到底是什么之前,我们先要解释下为什么需要它们。为何需要类型类让我们想象一下,由于某种深奥的原因Haskell语言的设计者忽略了相等性测试 ==的实现。听到这个消息后,在震惊之余你毅然决然的决定去实现你自己的相等性测试。你的应用由一个简单的Color类型组成,因此你首先为这个类型实现相等性测试。初次尝试如下:-- file: ch06/naiveeq.hsdata Color = Red | Green | Bluecolo 阅读全文
posted @ 2011-07-25 16:04 银河系漫游指南 阅读(2672) 评论(0) 推荐(0) 编辑
摘要: 定义新的数据类型虽然列表和元组很有用,我们还是经常想要构建自己的数据类型。这可以我们在的程序的值上增加结构。可以把相关的值集合起来给一个名字,与其他类型相区分,来替代匿名元组的使用。定义自己的类型也可以提升代码的类型安全性:Haskell不会让我们偶尔把两个结构相似但类型名不同值弄混。为增加点动力,我们来考虑一个小的在线书店需要管理的数据类型。我们不会尝试做完整的和实际的数据定义,不过至少和现实世界问题联系起来了。用 data 关键字定义新的数据类型。-- file: ch03/BookStore.hsdata BookInfo = Book Int String [String] deriv 阅读全文
posted @ 2011-07-25 16:03 银河系漫游指南 阅读(2083) 评论(0) 推荐(0) 编辑
摘要: 为何关心类型?Haskell中任何一个表达式和函数都有类型。比如,逻辑值True是Bool类型,"foo"的类型是String。一个值的类型说明它与同类型的其他值共享一些特定的属性。例如,可以把数字相加,可以把列表进行连接,这些操作是这些类型的属性。我们说一个表达式“有一个类型X”或者“类型是X”。开始深入探讨Haskell的类型系统之前,先来说下为什么要关心类型:它们究竟是干什么的?在计算机的最底层所关心的是字节,没有任何附加的结构。类型系统给了我们抽象的能力。类型赋予原始的字节以意义:我们就可以说“这些字节是文本”,“那些字节是一个机票预定”等。通常类型系统还可以让我们 阅读全文
posted @ 2011-07-25 15:59 银河系漫游指南 阅读(1463) 评论(1) 推荐(0) 编辑
摘要: 请注意在阅读本书前面几章时,我们有时会用受限制的简单的形式来介绍一些概念。Haskell是一种很有深度的语言,如果一次把给定主题的所有方面都展现出来的话,会压得初学者喘不过气来。在我们拥有扎实的Haskell基础后,将对最初提及的这些概念作进一步阐述。Haskell环境Haskell 语言有很多实现,其中有两个用得较广。Hugs是一个解释器,主要用于教学。实际应用中,Glasgow Haskell编译器(GHC)更加流行。GHC比Hugs更适合实际的工作:可以编译生成本地代码,支持并行执行,提供实用的性能分析与调试工具。因此,本书将使用GHC的Haskell实现。GHC有三个主要部件:1. g 阅读全文
posted @ 2011-07-25 15:58 银河系漫游指南 阅读(2942) 评论(0) 推荐(0) 编辑