初識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),當被打印時會換行。需import Data.Char才能使用。

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來對應,則可以有:

    

 

    zWith f xs ys = [(f x y) | (x, y) <- zip xs ys]

 可以有多個generator,但操作類似與多重循環,且后面的generator可以建立在前面的generator上。

如果不想多重循環而只想一一對應(其實相當於zipWith)的話,可以:

[(x, y) | (x, y) <- zip [1, 2, 3] [3, 4, 5]]

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'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM