初识Haskell 二:基本操作符、类型Type、数据结构
对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结。环境Windows
1. 在安装了ghci后,便可以进行Haskell的编译,点击GHCi 即可在命令行中打开ghci,也可点击WinGHCi,也可直接在命令行中ghci进入。


直接在命令行中输入ghci进入
2. :? 显示操作命令(注意有“ : ”),常用操作有:
:cd 进入指定路径
:load 载入文件
:quit 退出ghci
3.Haskell使用缩进(indentation)来表示上一行的续写。单行注释符号-- 块注释 {- -}
类型Type:
Integer和Int
两者均表示整数,区别在于:Int的范围为电脑存储一个字(word)的大小,是有限的。Integer是数学意义上的整数,理论上是无限大的,和电脑内存有关。若在计算时结果会超出Int的范围,则在表达式上用 ::Integer 表示为Integer类型,但实际上目前的gchi似乎是当超出Int时,自动用Integer类型表示,不用标明,但超出Int的结果用Int类型表示则显示为0。

Float:单精度浮点数single-precision floating point numbers & Double:双精度浮点数double-precision numbers
浮点数在Haskell中是非精确表示的(当然其他语言也是),比如0.11 - 0.10 和 2.11 - 2.10的结果理应一样,但在Haskell中则不一样(也与电脑有关)

所以需要注意的是当比较两个浮点数时,是比较其差值的绝对值是否小于一定范围(within an acceptable error tolerance)。
Ratio Integer:精确表示有理数
因为有理数都可以表示为分数的形式,Haskell用分子(numerator)%分母(denominator)的形式表示有理数。使用前需要import Data.Ratio。

Bool:布尔值
Char:字符类型
用单引号(single-quote)将字符包起,如 'a'。注意与表示中间操作符的反引号(back-quote)区分,'?'是Char,`div`是操作符。还有'\n'为换行符(newline),当被打印时会换行。
String:字符串
String是0个或多个字符的组合,用双引号(double-quote)包起,'a' 和 "a"的区别在于前一个是字符a,后一个是一个包含了字符a的字符串。
基本数据结构:
元组tuple
元组是将一系列数据值(可以是0个,但不可以是1个!)以逗号分隔放在括号里,如(2, "dog")是1个2个元素的元组,它的类型是(Int, String)。一个元组有n个元素,则成为n-tuple,2-tuples常被叫做pairs,有0-tuple,写作(),用来作为假值(dummy value),但没有1-tuple。
表(翻译成表存疑,还不知是否合适)list
List是函数式语言中最常用的数据结构,相当于C中的数组,以中括号 [ ] 表示,以逗号 , 分隔,存储一系列相同type的数据(也可以是list of tuples),如[1, 2, 3]是a list of integers。List可以存储任意数量的元素(可以是0个即[ ]),但元素必须是同一类型的,如:
[13, 9, -2, 100] :: [Int]
["cat", "dog"] :: [String]
[[1, 2], [3, 7, 1], [ ], [900]] :: [ [Int] ]
字符串String实际上就是字符Char的list,"abc" 与['a', 'b', 'c']是相同的。 表示一系列数字或字符时,可以只写开头1个或2个和最后1个,中间用 .. 代替,如果只写开头1个,默认增量为1,写2个则以差值为增量。如:

: 用于将新元素添加到list的首部,发音为cons(because it constructs a list),示例:
1:[2, 3] => [1, 2, 3]
1:[ ] => [1]
所有的list都是由空list[ ]用 : 组成的,其实[1, 2, 3]这种写法只是list一个更好看的语法表达而已,写成 (1:(2:(3 : []))) 或者去掉括号 1: 2: 3: []也是一样的。
Haskell提供了一系列特色使得list易于使用,列表解析list comprehension让使用者直接定义list而不用写程序去建造它们,其基于数学集合的定义形式像{ x2 | x ∈ S},基础的列表解析是由一个表达式和生成器generator构成的:
[expression | generator]
有generator指明了一系列要被带进左边的表达式中的值,形式是var <- list,如:

<-右边的如果是list of tuples的话,var则变成了a tuple of variables,则可以有:

可以有多个generator,但操作类似与多重循环。

generator还可以添加限制条件filter,filter是一个Bool类型的表达式,当从generator取出一个值时,若表达式值为False则扔掉,取下一个值。

操作符operator:
二元操作符其实也是函数,但放在参数前要加(),如:

:: operator 指明该表达式的类型read it as has type,如2::Int says 2 has type Int
+ 加 addition
- 减 subtraction
* 乘 multiplication
/ 除 division 如5/2 => 2.5
^ 幂函数 exponentiation
** 浮点数幂函数the floating point exponentiation,如 2**0.5=>1.41421
== 布尔类型操作符 等于
/= 布尔类型操作符 不等于
< 布尔类型操作符 小于
<= 布尔类型操作符 小于等于
> 布尔类型操作符 大于
>= 布尔类型操作符 大于等于
&& 布尔类型操作符 与
|| 布尔类型操作符 或
not 布尔类型操作符 非
++ 字符串操作符 用于连接连个字符串,如 "abc" ++ "def" => "abcdef"
常用函数functions:函数名+空格+表达式即可,不用括号,当然在嵌套时要括号。
二元函数表示时,若放在元素的前面则直接打出,如div 5 2,若放在中间(二元函数)则要用反引号(back-quote,和~一个键,数字键1的左边)表示,如 5 `div` 2。
div 整除 如 div 5 2 或 5 `div` 2结果为2
mod 求余
max 求两者中的较大值 如max 3 8 => 8
min 求两者中的较小值 如min 3 8 => 3
toUpper 返回该字母的大写形式,需要import Data.Char
toLower 返回该字母的小写形式,需要import Data.Char
length 返回该字符串的长度
fst 返回二元元组的第一个元素,如fst (1, 'a') =>1
snd 返回二元数组的第二个元素,如snd (1, 'a')=>'a'
初识Haskell 二:基本操作符、类型Type、数据结构的更多相关文章
- python应用(5):变量类型与数据结构
如前所说,写程序如同给算法写壳,而算法就是流程,所以流程是程序的主角(但这个流程不一定要你来设计).在程序中,为了配合流程(算法)的实现,除了顺序.分支与循环语句的使用,还要借助"变量&qu ...
- 转载:oracle 自定义类型 type / create type
标签:type create oracle object record 一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarc ...
- oracle 自定义类型 type / create type
一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...
- javascript 操作符类型隐性转换
javascript 操作符类型隐性转换 (一).一元操作符只能操作一个值的操作符叫做一元操作符1.递增和递减操作符a. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作 ...
- orcle自定义类型type/create or replace type
一.type / create or repalce type 区别联系 相同: 可用关键字create type 或者直接用type定义自定义类型, 区别: create type 变量 as ta ...
- 初识Haskell
在COMP30026 Models of Computation中接触了新的编程语言Haskell,一个之前听都没有听过的语言,在此记录关于Haskell的一些最基本概念. 1.Haskell是一个函 ...
- 初识JavaScript(二)
初识JavaScript(二) 我从上一篇<初识JavaScript(一)>知道和认识JavaScript的词法结构,也开始慢慢接触到了JavaScript的使用方法,是必须按照JavaS ...
- java基础之反射类型Type
Java在加入泛型之后,仅仅Class已经不足以描述数据的类型了,比如List<String>类型的数据,其Class的类型为List.class,但是其类型包含了泛型参数,所以java引 ...
- ES6新特性:Javascript中Set和WeakSet类型的数据结构
ES6提供了新的数据结构Set,Set对象不是数组, 可以用来保存对象或者基本类型, 所有保存的值都是唯一的, chrome浏览器>38和FF>13,以及nodeJS,对Set支持良好, ...
随机推荐
- Dom4J配合XPath解析schema约束的xml配置文件问题
如果一个xml文件没有引入约束,或者引入的是DTD约束时,那么使用dom4j和xpath是可以正常解析的,不引入约束的情况本文不再展示. 引入DTD约束的情况 mybook.dtd: <?xml ...
- Python基础(zip方法)
zip函数: 描述:将zip函数中的两个可迭代对象参数按对应索引值进行匹配组合,得到zip对象.(拉链式函数) zip函数简单应用如下: #-----------------zip函数-------- ...
- Java实现单链表
真正的动态数据结构(引用和指针) 优点:真正的动态,不需要处理固定容量的问题. 缺点:丧失随机访问的能力. 链表就像寻宝,我们拿到藏宝图开始出发寻宝,每找到一个地方后,里面藏着下一步应该去哪里寻找.一 ...
- 解决mac上每次升级nodejs都要重新安装扩展包的问题
虽然有了一些新生派竞品比如yarn,但使用或者习惯了npm的开发者仍然大有人在. 以前用起来没注意到这个现象,最近一段时间发现,每次随着使用brew upgrade自动升级了nodejs版本,原来安装 ...
- linux下利用nohup后台运行jar文件包程序
Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...
- ByteView和Sink
久违啦米娜桑!!! 最近有点忙,一月有余没有更新了,实在对不起大家!!! 上线后看到不少朋友发的私信,感谢大家的赞许与信任,后面我会尽最大的努力按时更新,不断推出更优质的文章!!! 本来计划最后花1讲 ...
- 深入解读MySQL8.0 新特性 :Crash Safe DDL
前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...
- k邻近算法(KNN)实例
一 k近邻算法原理 k近邻算法是一种基本分类和回归方法. 原理:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实 ...
- NFS服务和DHCP服务讲解(week3_day2)--技术流ken
NFS服务端概述 NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS: NFS允许一个系统在网络上与他人共享目录 ...
- css 半圆效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...