python入门编程, 之后用c++学习数据结构,Haskell萌新。
参考教材:Learn You a Haskell for Great Good (http://learnyouahaskell.com/)
操作环境:Ubuntu下Linux64位虚拟机
Chapter1部分内容
逻辑运算
逻辑值 Boolean value: True, False
逻辑运算符 Boolean operator: &&, ||, not
判断相等和不等 Equality and inequality: ==, /=
运算优先级priority () > 函数调用function call > 其它数学运算others
If...then...else
Haskell要求有 if 必须有else。
List
Haskell的list类似于c++里的数组(array), 必须是相同类型的元素(homogeneous),使用[ ] 包围。
列表属性:
length a(list) 获取元素个数
null a(list) 判断是否是空list。
元素添加:
a(list) ++ b(list):遍历a后将b加在尾部。
a(element): b(list) : 将a加在b的开头。
a(element) `elem` b(list) 判断a是不是b中的元素。
以上二者中后者在元素多时据说更高效。可能是类似链表的结构?
元素获取:
a(list) !! b(index) 利用下标获取。从0开始计算下标。python 和 c++里的[ ]
head a(list) 获取第一个元素。
tail a(list) 返回除去第一个元素后的list。
last a(list) 获取最后一个元素。
init a(list) 获取除去最后一个元素后的list。
take a(int) b(list) 从b中获取前a个元素组成的list,不足则返回整个list
drop a(int) b(list) 从b中获取去除前a个元素后余下的list, 不足则返回空list。
多个list:
小list可以组成大list,但是同样要求不同list的元素类型相同。
list比较参考字符串比较规则。
其它操作:
reverse/sum/product/maximum/minimum a(list) 倒置, 求积, 求和, 求最大元素, 求最小元素
replicate a(element) b(int) 将a重复b次构成list。
cycle a(list), repeat a(element) 获取由a构成的list
Range
Haskell中,range的表达类似于数学, 使用若干样例作为模板,使用..表示省略,元素个数可以有限也可以无限。默认模式类似求succ。
range在我的理解里与python中类似,也是一种iterator对象。考虑到这门语言lazy的性质,只有在需要的时候才会被呈现。这也是为什么上面的cycle, repeat可以使用(毕竟算法要求有限性)
另外,这里的range是前后都闭的。
List Comprehension
Haskell中的list comprehension的用法与Python类似,但是表达上更接近数学中的集合表达。使用|分割元素和条件,使用,分割多个条件, 使用<- 表达属于。范围限制条件放在其他条件之前。
Tuple
tuple可以存放类型不同的元素。不同长度或者元素种类不同的tuple都被视为不同的类型,不能放在同一个list中。 tuple使用( ) 包围。
对于二元组, 可以使用fst 和scd 获取第一个和第二个元素。