Real World Haskell学习篇-第1章: 入门

1. 初识解释器ghci

  1.1  查看帮助: :?

  1.2  修改提示符: :set prompt ghci>>>

  1.3  加自己指定模块: :module + Data.Ratio

2. 基本交互

  2.1 基本算术运算

    中缀表达式:

1 ghci>>> 3 ^ 3
2 27
3 ghci>>> 2 + 4
4 6
5 ghci>>> 5 / 3
6 1.6666666666666667

    前缀表达式:

1 ghci>>> (^) 3 3
2 27
3 ghci>>> (/) 5 2
4 2.5
5 ghci>>> (+) 1 9

  2.2 算术中的负数

1 ghci>>> -8
2 -8
3 ghci>>> 1 + -4
4
5 <interactive>:57:1:
6     Precedence parsing error
7         cannot mix ‘+’ [infixl 6] and prefix `-‘ [infixl 6] in the same infix expression
8 ghci>>> 1 + (-3)
9 -2

-8其实并不是直接表示负数8, 而是利用一元操作符‘-‘对8取负, 所以第3行不能与中缀表达式一起使用, 除非加上()。

1 ghci>>> 55*-2
2
3 <interactive>:60:3:
4     Not in scope: ‘*-’
5     Perhaps you meant one of these:
6       ‘*>’ (imported from Prelude), ‘**’ (imported from Prelude),
7       ‘*’ (imported from Prelude)

这样是另一种不认识的操作符。

  2.3 布尔运算(True False)和比较运算

3种运算符: && || not    Haskell中True不是1, False不是0.

 1 ghci>>> True && False
 2 False
 3 ghci>>> True || False
 4 True
 5 ghci>>> not False
 6 True
 7 ghci>>> True && 1
 8
 9 <interactive>:75:9:
10     No instance for (Num Bool) arising from the literal ‘1’
11     In the second argument of ‘(&&)’, namely ‘1’
12     In the expression: True && 1
13     In an equation for ‘it’: it = True && 1
14 ghci>>> 1 == 1
15 True
16 ghci>>> 4 > 6
17 False
18 ghci>>> 33 <= 50
19 True

  2.4 运算符优先级和结合性

可以有命令 :info 查看指定操作符的优先级值, 1表示最低, 9 表示最高。

 1 ghci>>> 2 + 3 * 5 ^ 2
 2 77
 3 ghci>>> :info (+)
 4 class Num a where
 5   (+) :: a -> a -> a
 6   ...
 7       -- Defined in ‘GHC.Num’
 8 infixl 6 +
 9 ghci>>> :info (*)
10 class Num a where
11   ...
12   (*) :: a -> a -> a
13   ...
14       -- Defined in ‘GHC.Num’
15 infixl 7 *
16 ghci>>> :info (^)
17 (^) :: (Num a, Integral b) => a -> b -> a     -- Defined in ‘GHC.Real’
18 infixr 8 ^

  2.5 变量的定义

使用ghci的let定义临时变量

1 ghci>>> pi
2 3.141592653589793
3 ghci>>> e
4
5 <interactive>:84:1: Not in scope: ‘e’
6 ghci>>> let e = exp 1
7 ghci>>> e
8 2.718281828459045

exp 1 表示调用指数函数exp,参数为1, 不必使用()。

3. 列表(List)

  列表长度可以是任意的。

  空的列表就是[]。

  列表中的元素必须相同类型。

 1 ghci>>> [1,2,3,4]
 2 [1,2,3,4]
 3 ghci>>> []
 4 []
 5 ghci>>> [‘foo‘,‘rt‘]
 6
 7 <interactive>:89:2:
 8     Syntax error on ‘foo‘
 9     Perhaps you intended to use TemplateHaskell
10     In the Template Haskell quotation ‘foo‘
11 ghci>>> ["foo","rt"]
12 ["foo","rt"]
13 ghci>>> [True,False,1,"str"]
14
15 <interactive>:91:15:
16     Couldn‘t match expected type ‘Bool’ with actual type ‘[Char]’
17     In the expression: "str"
18     In the expression: [True, False, 1, "str"]
19     In an equation for ‘it’: it = [True, False, 1, ....]

  可以用列举符号 .. 表示一系列的列表元素, 也可以根据前面的元素步长,自动填充后面省略的元素, 但是float类型可能会涉及到四舍五入的情况:

 1 ghci>>> [1..10]
 2 [1,2,3,4,5,6,7,8,9,10]
 3 ghci>>> [1,4,7..20]
 4
 5 <interactive>:93:7: parse error on input ‘..’
 6 ghci>>> [1,4,7,..20]
 7
 8 <interactive>:94:8: parse error on input ‘..’
 9 ghci>>> [1,4..20]
10 [1,4,7,10,13,16,19]
11 ghci>>> [1,8..20]
12 [1,8,15]
13 ghci>>> [1.2..2.3]
14 [1.2,2.2]
15 ghci>>> [1.2..2.6]
16 [1.2,2.2]
17 ghci>>> [1.2..3.6]
18 [1.2,2.2,3.2]
19 ghci>>> [1.0..1.8]
20 [1.0,2.0]

  当然你可以用[1..], 省略终点的方式产生一个无穷数列。

3.1 列表操作符 (连接)

  使用 ++ 连接N个相同元素的列表。

  使用 : 在某列表头部加入。(格式必须: 前面是单个元素,后面是一个列表)

 1 ghci>>> [] ++ [False,True] ++ [False]
 2 [False,True,False]
 3 ghci>>> 100:[2,3,4,5] ++ [6,8,4]
 4 [100,2,3,4,5,6,8,4]
 5 ghci>>> [2,3]:1
 6
 7 <interactive>:105:1:
 8     Non type-variable argument in the constraint: Num [[t]]
 9     (Use FlexibleContexts to permit this)
10     When checking that ‘it’ has the inferred type
11       it :: forall t. (Num t, Num [[t]]) => [[t]]

4. 字符串和字符

  字符串就是很多个单字符组成的列表, 所以可以列表的连接操作。

  putStrLn 是输出字符串的函数。 \n \r 与C语言一样转意。

  ""与[]是相同的。

 1 ghci>>> "Hello Haskell"
 2 "Hello Haskell"
 3 ghci>>> putStrLn "We are in ghci console.\n See here."
 4 We are in ghci console.
 5  See here.
 6 ghci>>> ‘c‘
 7 ‘c‘
 8 ghci>>> let a = [‘h‘,‘e‘,‘l‘,‘l‘,‘o‘]
 9 ghci>>> a
10 "hello"
11 ghci>>> a == "hello"
12 True
13 ghci>>> [] == ""
14 True
15 ghci>>> ‘w‘:"Haskell"
16 "wHaskell"
17 ghci>>> "Frist" ++ "Second"
18 "FristSecond"

5. 类型表示

  Haskell中,所有的类型以大写字母开始,变量以小写字母开始。

  可以使用 :set +t 是ghci返回结果的类型, :unset +t。

  可以使用 :type var/expression 显示变量或表达式的类型, 并不参与计算。

 1 ghci>>> :set +t
 2 ghci>>> ‘c‘
 3 ‘c‘
 4 it :: Char
 5 ghci>>> "foo"
 6 "foo"
 7 it :: [Char]
 8 ghci>>> 7^80
 9 40536215597144386832065866109016673800875222251012083746192454448001
10 it :: Num a => a
11 ghci>>> :m +Data.Ratio
12 ghci>>> 11 % 33
13 1 % 3
14 it :: Integral a => Ratio a
15 ghci>>> 11 % 3.3
16
17 <interactive>:121:1:
18     No instance for (Fractional a0) arising from a use of ‘it’
19     The type variable ‘a0’ is ambiguous
20     Note: there are several potential instances:
21       instance Integral a => Fractional (Ratio a)
22         -- Defined in ‘GHC.Real’
23       instance Fractional Double -- Defined in ‘GHC.Float’
24       instance Fractional Float -- Defined in ‘GHC.Float’
25     In the first argument of ‘print’, namely ‘it’
26     In a stmt of an interactive GHCi command: print it
27 ghci>>> :unset +t
28 ghci>>> type ‘c‘
29
30 <interactive>:123:6: parse error on input ‘‘’
31 ghci>>> :type ‘c‘
32 ‘c‘ :: Char
33 ghci>>> :type 1+8
34 1+8 :: Num a => a

6. 行计数程序 (WC.hs)

1 main = interact wordCount 2 where wordCount input = show (length (lines input)) ++ "\n"

然后新建一个quux.txt文件进行测试(内容随便写写)。

打开shell命令行切换到当前目录, 执行: runghc WC < quux.txt

即可得到txt文件的行数。

时间: 2024-10-22 10:20:05

Real World Haskell学习篇-第1章: 入门的相关文章

《Mysql 公司职员学习篇》 第一章 小A的烦恼

第一章  小A的烦恼 ----- 为什么学习数据库 和 如何选择数据库 小A是某公司的职员,公司数据部的员工,平常的大小工作,完全离不开EXCELL,而最近小A却越来越苦恼,不由的向好朋友小Y吐槽.小Y是某互联网公司的程序员,拥有多年开发经验. 小Y:"小A,你最近'印堂发黑',越来越疲劳无力,怎么?工作上遇见什么难题了?". 小A:"唉,别提了,最近公司发展迅速,数据量越来越大,我那'极品'电脑,关打开EXCELL就要卡个半天,再加上处理和计算,一天下来,卡顿的时间,都够我

【Android学习篇】安卓自学入门:001

Android-使用人数最多的手持设备操作系统 为何我要学习Android? 我在校的时候学习的是Java web开发,毕业后来到一家游戏公司,主要做unity 3D 和 cocos 2d 开发.在公司,我等于是闲人,啥都不用做,偶尔帮他们写个SQL,统计个数据啥的! 在公司待了半个月吧,这没事儿做.公司给的需求业务不明确.刚毕业的毛头小子也看不懂需求.我就觉得该学习点别的,打发打发没事做的时间,于是我选择Android ,毕竟这是最近烫手的技术. 声明: 我初学Android,很多地方理解不到

java学习之第五章编程题示例(初学篇)

1 /* 2 Animal.java 3 */ 4 package animal; 5 6 public abstract class Animal { 7 public abstract void cry(); 8 public abstract String getanimalName(); 9 } 1 //Dog.java 2 package animal; 3 4 public class Dog extends Animal 5 { 6 7 String aa="旺旺"; 8

html5学习篇:05:论道html电子书-第一章

1.源代码下载地址:http://html5book.xiuyetang.com/ 第一章:列用html5做网站 1.1多数人呢不了解的html5时代的网页设计的10大理由 阴影代码可控.阴影和圆角 动画简单易懂.依赖强大的css3的动画属性,可以高小的开发出各种动画效果.非常的轻松 渐变数值化操作. 字体图片矢量化.css3的网络字体功能 表单验证轻松搞定 数据类型扩大一倍.大量新增的input属性带来的更加友好的用户界面. 音频,视频,无需插件完成. 1.2:一个典型的html5网页 htm

OC学习篇之---单例模式

在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单例模式,单例模式在设计模式中用的可能是最多的一种了,而且也是最简单的一种 实现单例模式有三个条件 1.类的构造方法是私有的 2.类提供一个类方法用于产生对象 3.类中有一个私有的自己对象 针对于这三个条件,OC中都是可以做到的 1.类的构造方法是私有的 我们只需要重写allocWithZone方法,

我的2015碎碎念—学习篇、项目篇、工作篇、生活篇

去年在日记作了一次年度总结过后,我就对自己说以后每年年末都要做一次总结,这对自己是非常有帮助的,在这2015年最后一个月,是该整理下自己在即将结束的一年里的所得所失,给过去的自己盖个章,给未来的自己提个醒! 学习篇 为了吸收正能量,一开始就先总结下自己这一年的学习生涯吧. 从C#转JAVA, 可以说15年大半年的时间都花在了研究语言开发上,幸好最终出了一个小小的项目安慰自己,了了迷茫期间最重要的一件事(看来换工作不成问题了). 读书 学习总离不开看书,15年的读书情况可以分为两个阶段: 换工作之

Stealth视频教程学习笔记(第二章)

Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提炼出其中的知识点和思路思想. 视频地址在(http://www.youku.com/playlist_show/id_23389553.html),是一个Stealth的专辑,这里只放上本章第一个视频,其它的大家在上面的链接中慢慢看吧. 第二章有一个视频是FLV格式的,我没法把字幕嵌入其中,所以优酷

大学本科4年总结---4年残念(学习篇,工作篇,保研篇,生活篇,遗憾篇,畅想篇)

距离毕业都过去好几天了,才花了点心思整理下自己在过去4年里的所得所失,给过去的自己盖个章,给未来的自己提个醒!愿自己的眼里总有光芒,活成自己想要的模样! 学习篇 先总结一下自己4年的学习生涯.专业排名1/48,4年均分90.57. 1.数学 由于是信息与计算科学专业,4年内大部分是数学类的专业课,从数学分析.高等代数.解析几何开始,到数学物理方程,实变函数,图论等.自己感觉学习劲头是一年不如一年,有一部分是在编程上花的时间越来越多,还有一部分花在各种琐事上,更多的是,自己变懒了!!!!看这成绩单

(转载)OC学习篇之[email&#160;protected]关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性,今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题: 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了 二.关键字@class的作用 在来看一下OC中的关键字@class的作用,在