Haskell第一天

安装

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]。
这里写图片描述


List Comprehension
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值