《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还是先看其它一些入门书籍吧,这本书配套着学学还是不错的。
第二章 Definitions
1 How does the Haskell system respond to the following command?
HASKELL DEFINITION • word = reverse "drow"
HASKELL COMMAND • word
a True
b False
c "word"
d "drow"
2 How about this command?
HASKELL DEFINITION • isTrue str = str == "True"
HASKELL COMMAND • isTrue (reverse "Madam, I’m Adam.")
a True
b False
c ".madA m’I ,madaM"
d Type error in application
3 And this one (assuming the definitions in questions 1 and 2 have been made)?
HASKELL COMMAND • isTrue word
a True
b False
c "drow"
d Type error in application
=========================================================
先
不
要
看
答
案
=========================================================
答案:
1 c
“=”在haskell中用来表示函数定义,“=”的左边是函数名称和形式参数(更强大的是模式pattern),右边是函数的定义。
a=1在C语言中是很简单的赋值语句,而在Haskell中有不同的含义,a永远是1,它是不可更改的。
Haskell会自动推断函数的返回类型,这里的word实际上是一个字符串,即字符列表
Haskell程序是纯函数式语言,所以一切皆函数,Haskell程序绝大部分都是一堆函数定义语句。
2 b
isTrue str定义了一个函数,名称是isTrue,str是一个形式参数
str == “True”是函数体,就是判断str与"True”字符串是不是相等,返回值是布尔类型True或False
isTrue (reverse "Madam, I’m Adam.")是执行一个函数调用,括号是必须的,如果没有括号,haskell会把reverse当成isTrue的一个参数,就会报语法错误
reverse "Madam, I’m Adam."的结果是".madA m’I ,madaM",显然不等于"True”字符串
"True”是一个字符串,而True是表示为真的布尔类型
3 b
word是一个函数名称,根据它的定义,这里为一个字符串,实际上是"word”
"word”与"True”显然不相等,所以结果返回False
书中判断是否为回文字符串的函数:isPalindrome phrase = (phrase == reverse phrase)
由于是多态的,还可以判断回文数字串。
isPalindrome [1,2,3,2,1]
True
《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章没有习题。