《Two Dozen Short Lessons in Haskell》(Copyright © 1995, 1996, 1997 by Rex Page,有人翻译为Haskell二十四学时教程,该书如果不用于赢利,可以任意发布,但需要保留他们的copyright)这本书是学习Haskell的一套练习册,共有2本,一本是问题,一本是答案,分为24个章节。在这个站点有PDF文件。几年前刚开始学习Haskell的时候,感觉前几章还可以看下去,后面的内容越来越难以理解。现在对函数式编程有了一些了解后,再来看这些题,许多内容变得简单起来了。
初学Haskell之前一定要记住:
把你以前学习面向过程的常规的编程语言,如Pascal、C、Fortran等等统统忘在脑后,函数式编程完全是不一样的编程模型,用以前的术语和思维来理解函数式编程里的概念,只会让你困惑和迷茫,会严重地影响你的学习进度。
这个学习材料内容太多,想把整书全面翻译下来非常困难,只有通过练习题将一些知识点串起来,详细学习Haskell还是先看其它一些入门书籍吧,比如说《Haskell趣学指南》,这本书配套着做练习还是相当不错的。
第一章 Hello World, Etc.
这一章中讲了2种内置的数据类型data types,字符串String和布尔类型Boolean。
1 How does the Haskell system respond to the following command?
HASKELL COMMAND • reverse "Rambutan"
a "Natubmar"
b "tanbuRam"
c "Nambutar"
d natubmaR
2 How about this one?
HASKELL COMMAND • "frame" == reverse "emarf"
a True
b False
c Yes
d assigns emarf, reversed, to frame
3 And this one?
HASKELL COMMAND • "toh oot" == (reverse "too hot")
a True
b False
c Yes
d no response — improper command
4 And, finally, this one?
HASKELL COMMAND • reverse ("too hot" == "to hoot")
a True
b False
c Yes
d no response — improper command
======================================================================
先
不
要
看
答
案
=======================================================================
答案:
1 d
字符串就是放在引号之间的一串字符,如"Ringo”, "@#$%^"
在Haskell中的字符串实际上是字符的列表List,这点与C语言有些相似
"Rambutan"实际上就是['R', 'a', 'm', 'b', 'u', 't', 'a', 'n'],String是[Char]的语法糖。
reverse是一个函数,函数名与后面的参数是用空格隔开的,C语言里的f(x,y)在haskell就是f x y,一开始可能不太适应。
reverse是haskell里已经内置的一个函数,可以把一个列表中所有元素反序排列。
reverse函数是真正多态的,参数不仅可能是字符串,还可以是任意的List,reverse [1,2,3]的结果等于[3,2,1]
函数名一定是小写字母开头的,在haskell中把大写字母开头的名称强制认为是类型等其它东西。
进阶内容,reverse的源代码:
reverse :: [a] -> [a]
#ifdef USE_REPORT_PRELUDE
reverse = foldl (flip (:)) []
#else
reverse l = rev l []
where
rev [] a = a
rev (x:xs) a = rev xs (x:a)
#endif
2 a
布尔类型Bool只取2种值True, False
判断是否相等用==
用/=判断不相等,与C语言的!=是一个意思。
进阶内容:Bool实际上就是一个简单的数据定义,源代码:
data Bool = False | True
3 a
reverse是函数function,"too hot"是操作数operation,函数运算是最优先的,
reverse "ELBA" == "ABLE" 与 (reverse "ELBA") == "ABLE"是等价的
4 d
reverse函数后面只能跟一个列表,("too hot" == "to hoot")这个值是一个布尔值False,reverse函数需要的参数是List,所以reverse False会在Haskell中报错。
《Two Dozen Short Lessons in Haskell》学习(一)Hello World
《Two Dozen Short Lessons in Haskell》学习(二)Definitions
《Two Dozen Short Lessons in Haskell》学习(三)How to Run Haskell Programs
《Two Dozen Short Lessons in Haskell》学习(四)List Comprehensions
《Two Dozen Short Lessons in Haskell》学习(五)Function Composition and Currying
《Two Dozen Short Lessons in Haskell》学习(六)Patterns of Computation – Composition, Folding, and Mapping
《Two Dozen Short Lessons in Haskell》学习(七)- Types
《Two Dozen Short Lessons in Haskell》学习(八)- Function Types, Classes, and Polymorphism
《Two Dozen Short Lessons in Haskell》学习(九)- Types of Curried Forms and Higher Order Functions
《Two Dozen Short Lessons in Haskell》学习(十)- Private Definitions — the where-clause
《Two Dozen Short Lessons in Haskell》学习(十一)- Tuples
《Two Dozen Short Lessons in Haskell》学习(十二) 数值相关的类
《Two Dozen Short Lessons in Haskell》学习(十三)迭代及重复的常规模式
《Two Dozen Short Lessons in Haskell》学习(十四)截断序列和惰性求值
《Two Dozen Short Lessons in Haskell》学习(十五)- Encapsulation — modules
《Two Dozen Short Lessons in Haskell》学习(十六)- Definitions with Alternatives
《Two Dozen Short Lessons in Haskell》学习(十七) - 模块库
《Two Dozen Short Lessons in Haskell》学习(十八) - 交互式键盘输入和屏幕输出
《Two Dozen Short Lessons in Haskell》学习(十九) - 文件输入与输出
《Two Dozen Short Lessons in Haskell》学习(二十)- 分数
《Two Dozen Short Lessons in Haskell》学习(二十一)- 在形式参数中使用模式匹配
《Two Dozen Short Lessons in Haskell》学习(二十二)- 递归
第23章没有习题。