一切就绪以后,会出现 Prelude>
提示符告诉你 Prelude
库已经加载完毕,Prelude
库是 Haskell 缺省加载的库。
模块 Prelude 有时候被称为“标准序幕”(the standard prelude),因为它的内容是基于Haskell 98标准定义的。通常简称它为“序幕”(the prelude)。
此时有两种输入——命令或是表达式。先来研究一下命令:
命令是以 :
开头的。
首先当然是帮助命令 :?
或 :help
然后是退出命令 :q
或 :quit
然后是加载你自己编写的 hs
文档的命令 :l
和 :r
或 :load
和 :reload
.
执行shell命令 :!
,比如 : :!ls
:!dir /b
——做了个小实验,执行一下 :!ghci
然后发现需要 :q
两次。。。真是闲的蛋疼(´・_・`)
Haskell比较引人注目的地方在于它的类型检查系统,所以有一些类型检查的命令需要注意:
:t
或 :type
显示出这个表达式的类型
:set +t
所有表达式默认显示出其类型
:unset +t
字面意思
:i
显示 info
,比如 :i (+)
当然,set也有很多其他参数,比如 :set prompt
可以把你的模块的默认提示符给改掉啊什么的,不细说了。。
show系列的命令也很有意思,比如 :show bindings
,:show breaks
,:show imports
等等,都是很有用的命令
还有一些debug命令,目前还用不上,先不管它了。。
分别实验一下 1+1
,2^65535
,3**8
,2**65535
,"hello world"
a=1
的意思是定义了一个没有输入的函数
a,它会返回1
。
=并不是赋值的意思。要知道,Haskell 本着万物皆函数
的思想,这里的a=1
的意思是定义了一个没有输入的函数
a,它会返回1。
同样的,+
也是一个函数,只是因为它有两个参数故采用了人们所喜闻乐见的中缀写法。但你完全可以这么写:
c = (+) a b
不信的话可以去看info:
01.Prelude> :info (+)
02.class Num a where
03. (+) :: a -> a -> a
04. ...
05. -- Defined in `GHC.Num'
06.infixl 6 +
另外补充一点,ghci提供了一个名为it的特殊变量,它和计算器里的ANS一样,保存的是上一次
计算的结果。
列表和元组的区别
A tuple is a fixed-size collection of values, where each value can have a different type.
This distinguishes them from a list, which can have any length, but whose elements must all have the same type.
Prelude> (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63)
:4:1:
A 63-tuple is too large for GHC
(max size is 62)
Workaround: use nested tuples or define a data type
cons的运算符,它负责将单独一个元素添加到列表的最前面
ghci> 1 : [2,3]
[1,2,3]
ghci> 1 : []
[1]
说到列表就不得不说字符串。因为Haskell中的字符串完全就是字符列表的语法糖:
ghci> let a = ['l', 'o', 't', 's', ' ', 'o', 'f', ' ', 'w', 'o', 'r', 'k']
ghci> a
"lots of work"
ghci> a == "lots of work"
True
ghci> "" == []
True
ghci> 'a':"bc"
"abc"
ghci> "foo" ++ "bar"
"foobar"
使用 let 赋值
Prelude> let x = 1
Prelude> :t x
x :: Num a => a