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、数据结构的更多相关文章

  1. python应用(5):变量类型与数据结构

    如前所说,写程序如同给算法写壳,而算法就是流程,所以流程是程序的主角(但这个流程不一定要你来设计).在程序中,为了配合流程(算法)的实现,除了顺序.分支与循环语句的使用,还要借助"变量&qu ...

  2. 转载:oracle 自定义类型 type / create type

    标签:type create oracle object record 一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarc ...

  3. oracle 自定义类型 type / create type

    一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...

  4. javascript 操作符类型隐性转换

    javascript 操作符类型隐性转换 (一).一元操作符只能操作一个值的操作符叫做一元操作符1.递增和递减操作符a. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作 ...

  5. orcle自定义类型type/create or replace type

    一.type / create or repalce type 区别联系 相同: 可用关键字create type 或者直接用type定义自定义类型, 区别: create type 变量 as ta ...

  6. 初识Haskell

    在COMP30026 Models of Computation中接触了新的编程语言Haskell,一个之前听都没有听过的语言,在此记录关于Haskell的一些最基本概念. 1.Haskell是一个函 ...

  7. 初识JavaScript(二)

    初识JavaScript(二) 我从上一篇<初识JavaScript(一)>知道和认识JavaScript的词法结构,也开始慢慢接触到了JavaScript的使用方法,是必须按照JavaS ...

  8. java基础之反射类型Type

    Java在加入泛型之后,仅仅Class已经不足以描述数据的类型了,比如List<String>类型的数据,其Class的类型为List.class,但是其类型包含了泛型参数,所以java引 ...

  9. ES6新特性:Javascript中Set和WeakSet类型的数据结构

    ES6提供了新的数据结构Set,Set对象不是数组, 可以用来保存对象或者基本类型, 所有保存的值都是唯一的, chrome浏览器>38和FF>13,以及nodeJS,对Set支持良好, ...

随机推荐

  1. lua-nginx-module模块里ngx_lua的所有指令以及可用ngx所有方法

    http://www.04007.cn/article/430.html

  2. python接口自动化(三)--如何设计接口测试用例(详解)

    简介 上篇我们已经介绍了什么是接口测试和接口测试的意义.在开始接口测试之前,我们来想一下,如何进行接口测试的准备工作.或者说,接口测试的流程是什么?有些人就很好奇,接口测试要流程干嘛?不就是拿着接口文 ...

  3. Android-PickerView【仿iOS的PickerView控件,并封装了时间选择和选项选择这两种选择器】使用

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文主要演示Android-PickerView的选项选择器.时间选择器的简单运用.由于每一个版本略有不用,所以实际使用方式以git ...

  4. AlertConfirmDialog【基于AlertDialog的确认取消对话框】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 确认取消对话框,基于AlertDialog.不是基于DialogFragment. 按钮文本可以根据实际情况更换. 效果图 代码分析 ...

  5. Android 性能测试优质实践汇总

    这两天把testerhome上的关于Android 性能测试的精品文章看了一遍,很有收获,学习到了Android 性能测试该关注的一些细节.我所说的“精品”是指对我自己有启发的文章,可以被自己运用起来 ...

  6. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  8. cocos creator主程入门教程(十一)—— 有限状态机和行为树

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 本篇介绍有限状态机和行为树.有限状态机用于有限的状态下的AI,由于同时只能处于一个状态,多个状态需要多个 ...

  9. 如何在IIS上发布网站

    本片博客记录一下怎么用IIS发布一个网站,以我自己电脑上一个已经开发完成的网站为例: 1.打开项目 这是我电脑上的一个项目,现在我记录一下将这个项目发布到iis上的整个过程: 2.在vs2017中发布 ...

  10. 程序猿想聊天 - 創問 4C 團隊教練心得(一)

    今天難得參加了創問舉辦的 4C 團隊教練課程 From : http://www.cccoach.cn/Home/Activity/show/id/449.html 整個課程主要圍繞著 Common ...