安装
Haskell环境安装十分简单 ^-^
Win 去haskell platform下载相应版本
linux 通过:* Redhat `$ sudo yum install haskell-platform` * Debian `$ sudo apt-get install haskell-platform`
介绍
Haskell 是一门纯粹函数式程序语言 (purely functional programming language)。
命令式语言:执行操作需要给电脑安排一组命令,随着命令的
执行,状态就会随之发生改变。例如你指派变量 a 的值为 5,而随后做了
其它一些事情之后 a 就可能变成的其它值。有控制流程 (control flow),你
就可以重复执行操作。
函数式语言: 通过用函数来描述出问题 “是什么”,如
“阶乘是指从 1 到某个数的乘积”, “一个串行中数字的和” 是指把第一个数
字跟剩余数字的和相加。你用声明函数是什么的形式来写程序。另外,变量
(variable) 一旦被指定,就不可以更改了,你已经说了 a 就是 5,就不能再另
说 a 是别的什么数。
Haskell是惰性的,静态的。惰性语言仅在你真正需要结果时才会执行,惰性语言
中的计算只是一组初始数据和变换公式。静态语言当你编译程序时,编译器需要明确哪个是数字,哪个是字符串。
Haskell的编译器GHC,GHC可以解释执行Haskell Script(通常以.hs结尾),也可编译,还有类似Python那样的互动模式。通过在终端下输入ghci进入:
在ghci中输入: l fun.hs
,ghci就可以加载fun.hs
,一旦修改了这个hs,需要再次加载。
函数
在Haskell中,函数调用的形式为函数名,空格,空格分割参数列。
例:
函数拥有最高的优先级,若要取9乘10的后继,succ 9*10
是不可以的,正确写法: succ (9*10)
若某个函数有两个参数,可以使用中缀表达式。
例:
两个整数相除所得商的div函数,div 92 12
,还可写为92 div 12
。
编写第一个函数:
编写一个功能为将一个数字乘2的函数:
doubleFun x = x + x
函数声明为先函数名后跟由空格分隔的参数表。在声明后一定在 = 后定义函数行为。
保存为 first.hs
,在保存目录下打开ghci,执行:l first.hs
。
还可以在其他函数中调用你编写的函数:
doubleF x y = doubleS x + doubleT y
注:首字母大写的函数是不允许的
if…then…else
- Haskell 中 if 语句的 else 部分是不可省略。在命令式语言中,
你可以通过 if 语句来跳过一段源代码,而在 Haskell 中,每个函数和表达
式都要返回一个结果。 - Haskell 中的 if 语句的另一个特点就是它其实是个表达式,表达式就是返回一个值的一段源代码:5 是个表达式,它返回 5;4+8 是个表达式;x+y 也是
个表达式,它返回 x+y 的结果。正由于 else 是强制的,if 语句一定会返回某个值,所以说 if 语句也是个表达式。如果要给刚刚定义的函数的结果都
加上 1,可以如此修改:
doubleSmallNumber' x = (if x > 100 then x else x*2) + 1
List
- 在 Haskell 中,List 是一种单类型的数据结构,可以用来存储多个类型相同的元素。我们可以在里面装一组数字或者一组字符,但不能把字符和数字装在一起。
注:
字符串实际上就是一组字符的 List,“Hello” 只是[‘h’,’e’,’l’,’l’,’o’] 的语法糖而已。所以我们可以使用处理 List 的函数来对字符串进行操作。
- 将两个 List 合并是很常见的操作,这可以通过 ++运算子实现。
注:
在使用 ++ 运算子处理长字符串时要格外小心 (对长 List 也是同样),Haskell 会遍历整个的 List(++ 符号左边的那个)。在处理较短的字符串时问题还不大,但要是在一个 5000 万长度的 List 上追加元素,那可得执行好一会儿了。
: 运算子往一个 List 前端插入元素会是更好的选择。
: 与 ++ 的区别:
- : 运算子可以连接一个元素到一个 List 或者字符串之中
- ++ 运算子则是连接两个 List,若要使用 ++ 运算子连接单个元素到一个 List 之中,就用方括号把它括起使之成为单个元素的 List。[1,2,3] 实际上是 1:2:3:[]的语法糖。
若是要按照索引取得 List 中的元素,可以使用 !! 运算子,索引的下标为 0。
例:
注:
但你若是试图在一个只含有 4 个元素的 List 中取它的第 6 个元素,就
会报错。要小心!
list元素比较
当 List 内装有可比较的元素时,使用 > 和 >= 可以比较 List 的大小。它会先比较第一个元素,若它们的值相等,则比较下一个,以此类推。
head 返回一个 List 的头部,也就是 List 的首个元素。
tail 返回一个 List 的尾部,也就是 List 除去头部之后的部分。
last 返回一个 List 的最后一个元素。
init 返回一个 List 除去最后一个元素的部分。
length 返回一个 List 的长度。
null 检查一个 List 是否为空。如果是,则返回 True,否则返回 False。
应当避免使用 xs==[] 之类的语句来判断 List 是否为空,使用 null 会更好。
reverse 将一个 List 反转。
take 返回一个 List 的前几个元素。
drop会删除一个 List 中的前几个元素。
maximum 返回一个 List 中最大的那个元素。minimun 返回最小的。
sum 返回一个 List 中所有元素的和。product 返回一个 List 中所有元素的积。
elem 判断一个元素是否在包含于一个 List
Range
Range是构造 List 方法之一,而其中的值必须是可枚举的,像 1、2、3、4…字符同样也可以枚举,字母表就是 A..Z 所有字符的枚举。
例:
取前 24 个 13 的倍数
[13,26..24*13]
或者take 24 [13,16..]
repeat 接受一个值作参数,并返回一个仅包含该值的无限 List。你若只是想得到包含相同元素的 List ,使用 replicate 会更简单,如 replicate 3 10,得 [10,10,10]。