您的位置:首页 > 其它

【Real World Haskell】读书笔记 1.Getting Started

2012-12-22 18:11 232 查看
很长一段时间没有来博客园了,也不是这段时间很忙。只是一下子不知道该做什么,整日除了电影、小说之外,就是睡觉,生命似乎失去了光彩。

可能是因为毕业以后就要出去工作,这种转变有点不太适应。学校的生活让我厌倦,精神无处栖息,惶惶不可终日。

毕设摆在那里也不想理会,提不起兴趣,更别提毕设之外的东西。也许摆脱现在这种困境的一种方式,就是找点事情做,不要考虑做什么对自己有益,做就好了。


The hardest problems in modern software lie in performance, modularity, reliablity, and concurrency. With Real World Haskell, the authors do a great job in teaching how to tackle each of these problems with Haskell, a language that is generations ahead of today's mainstream.

--Tim Sweeney, founder Epic Games, and designer of the Unreal game engine.


引用《Real World Haskell》的一句书评作为开头。这位读者所说的第一句话确实是事实,在现代软件中最为困难的问题体现在性能、模块性、可靠性和一致性。当然,这些问题并不是仅仅依靠一门语言就可以解决的,算法也是相当重要的。

学习这门语言,可以了解函数式编程的特点,从而可以试着理解它与过程式编程、面向对象式编程之间的差别;另外,也可以了解Haskell的特性以及适用的地方,同时可以利用这门语言编写实用的程序。

Haskell环境

Haskell有多种实现,其中有两种被广泛用到的。

Hugs:

Haskell语言的解释器,最初用来作为教学使用。

Glasgow Haskell Compiler(GHC):

在实际应用程序中,这个会更流行。它比Hugs更适合“实际工作”:它编译成本地代码,支持并行执行,并提供有用的性能分析工具和调试工具。

这里跟本书一样,采用GHC作为Haskell环境。

GHC包含有三种主要组件:ghc、ghci和runghc。其中,ghc是用来生成快速执行本地代码的优化编译器;ghci是交互式的解释器和调试器;runghc可以以脚本的形式来运行Haskell程序,而不需要先编译它们。

Windows平台或者Mac OS平台的开发者可以直接访问GHC下载页面(http://www.haskell.org/ghc/download.html),下载二进制文件和安装包。

Linux平台和类UNIX平台下可以在GHC page distribution packages(http://www.haskell.org/ghc/distribution_packages.html)找到不同发行版的GHC。

Ubuntu和Debian Linux下可以直接通过命令行就可以进行安装,我是在Ubuntu 11.10安装的Haskell环境,命令为sudo apt-get install ghc6.

安装完GHC以后Haskell环境就搭建好了!

从ghci开始

刚搭建好的GHC的交互式解释器叫ghci,熟悉python或者ruby的朋友们肯定对python解释器和irb不陌生,ghci跟它们类似。在ghci这个交互式环境下,你可以输入Haskell表达式、查看模块并调试你的代码。

在类UNIX环境下,我们只需要在shell窗口输入ghci命令回车即可进入。以下是本机进入ghci的截图:



在这里我们可以查看到GHCI的版本,以及进入ghci所导入的包。提示符旁的Prelude表示Prelude标准库,它包含了一些有用的函数,当我们导入其他模块或源文件时也会在提示符中显示。当然你也可以DIY提示符,比如变成hacker>,只需要在ghci交互环境下输入:set prompt "hacker> ", just like this below :-)



怎样获取帮助

在ghci提示符中输入:?,它将会打印一条长串的帮助消息。



导入其他模块

进入ghci以后系统导入了Prelude标准库,如果使用Prelude库中所定义的类型、数值和函数,直接用就行了。但如果需要使用其他模块的定义,我们需要将它们导入进ghci里,使用:module命令:


eg:

Prelude> :module + Data.Ratio

小技巧: 在类UNIX平台下可以用TAB键提示和补全


这样我们就可以使用Data.Ratio模块的功能了,即可以让我们处理有理数。

ghci也可做计算器来使

我们可以使用容易理解的中缀表达式来实现简单的算术,Here are some examples:



ghci也支持前缀表达式,但符号需要括号包起来,不然会提示出错



这种简单的中缀算术就不再赘述了,跟咱们以前在小学学的算术是一个样。

布尔逻辑表达式

Haskell中布尔逻辑值为True和False,注意开头字幕均为大写。跟C语言一样,Haskell的逻辑运算符与和或分别是&&和||

与一些编程语言不同的是,在Haskell中数字0不等同与False,非0值也不等同于True,也就是说数字和布尔值是不能进行运算的,可见对于类型的检查是相当严格的。



另外,在算术比较操作符中,除了!=以外,其它都跟C语言相同,在Haskell语言中,不等于写为/=,我们知道/=在C语言里是另外一种含义。所以,这里需要注意区别。

除此之外,在C语言中用!表示逻辑否,而Haskell用not表示逻辑否。



运算符优先级

那么Haskell中运算符优先级是怎样的呢?我们可以通过:info命令来查看运算符的优先级,在Haskell中定义了1-9种优先级,其中1表示最低优先级,而9表示最高优先级。通过下图,我们可以看到加号优先级为6,乘号优先级为7。



常量

在Haskell中也实现定义了一些常量,例如pi。而e是通过函数来获取的,如要获取e的值可以输入exp 1。当然我们也可以定义e为exp 1,这样可以方便e值的使用。



列表

列表由方框包括,元素间通过逗号隔开,例如[1, 2, 3]。需要注意的是,逗号是分隔符,而不是终止符,这样[1, 2, 3, ]就是错误的,而在python中是合法的。

列表可以为任意长度,也可以为空。Haskell中空列表写为[]。

列表中所有的元素必须是相同的类型,如果违法了这一点会报错。



如果我们用枚举符表示一系列元素,Haskell将会为我们写入列表中。



是不是觉得非常强大?当然,枚举符只能适用于可以枚举的类型,对于字符串就不适用。因为你没法让计算机明白,["foo".."quux"]到底表示的是什么东西。

列表操作符

有两种符号可以用在列表上。++符号用来连接两个列表,:符号用来将一个元素添加到列表的首位。



字符和字符串

同C语言一样,字符是用一对单引号包括,字符串使用一对双引号包括。转义符也跟C语言相同,例如'\n'表示换行符,'\t'表示制表符。



实际上,在Haskell中,字符串就是由单独的字符组成的列表。看下面的例子,不过将字符串拆分成为字符列表确实很蛋疼。



这样,我们会发现""和[]是等价的,而且列表的运算符在字符串中也是支持的。



类型

在Haskell中遵循这样一点,类型名由大写字母开始,变量名必须由小写字母开始。

在ghci中,it是一个特殊变量名,它保存了我们输入的最后一个表达式的值。这并不是Haskell语言的特点,而仅仅是ghci。事先通过:set +t可以在表达式后打印表达式的类型。



如上所示it :: [char]这一行就表示it类型为[char]

分享一个简单的程序

-- file: ch01/WC.hs
-- lines beginning with "--" are comments.

main = interact wordCount
where wordCount input = show (length (lines input)) ++ "\n"


保存以上代码存为WC.hs,这个程序的功能就是打印文件的行数。运行时在shell终端输入runghc WC < quux.txt,最终可以打印quux.txt文件的行数。这里暂时不解释这个程序的含义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: