一切就緒以后,會出現 Prelude>
提示符告訴你 Prelude
庫已經加載完畢,Prelude
庫是 Haskell 缺省加載的庫。
模塊 Prelude 有時候被稱為“標準序幕”(the standard prelude),因為它的內容是基于Haskell 98標準定義的。通常簡稱它為“序幕”(the prelude)。
此時有兩種輸入——命令或是表達式。先來研究一下命令:
命令是以 :
開頭的。
首先當然是幫助命令 :?
或 :help
然后是退出命令 :q
或 :quit
然后是加載你自己編寫的 hs
文檔的命令 :l
和 :r
或 :load
和 :reload
.
執行shell命令 :!<cmd>
,比如 : :!ls
:!dir /b
——做了個小實驗,執行一下 :!ghci
然后發現需要 :q
兩次。。。真是閑的蛋疼(′?_?`)
Haskell比較引人注目的地方在于它的類型檢查系統,所以有一些類型檢查的命令需要注意:
:t
或 :type
顯示出這個表達式的類型
:set +t
所有表達式默認顯示出其類型
:unset +t
字面意思
:i <name>
顯示 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)
<interactive>: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