Haskell模組

如果使用過Java,那麼應該知道如何將所有類綁定到一個名為package的檔夾中。同樣,Haskell可將這種類似package概念視為模組。

Haskell是一種函數化編程語言,所有內容都表示為一種運算式,因此,模組是相似或相關類型的函數的集合。
可以將函數從一個模組導入另一個模組。在開始定義函數之前,所有import語句都應放在第一位。在本章中,我們將學習在Haskell模組中定義和使用的不同函數。

1. List模組

列表提供了一些很棒的功能來處理列表類型數據。導入Data.List模組後,便可以使用多種函數功能。在下面的示例中,使用了List模組下的一些重要功能。

import Data.List

main = do
   putStrLn("Different methods of List Module")
   print(intersperse '.' "xuhuhu.com")
   print(intercalate " " ["Lets","Start","with","Haskell"])
   print(splitAt 7 "HaskellTutorial")
   print (sort [8,5,3,2,1,6,4,2])

在這裏,有許多函數不需要定義它們。這是因為這些函數在List模組中已經定義並且可用。導入List模組後,Haskell編譯器使所有這些函數在全局名稱空間中可用。

執行上面示例代碼將產生以下輸出結果:

Different methods of List Module
"Y.i.i.b.a.i...c.o.m"
"Lets Start with Haskell"
("Haskell","Tutorial")
[1,2,2,3,4,5,6,8]

2. Char模組

Char模組具有很多預定義的函數功能,可以與Character類型一起使用。看一下下麵的代碼塊:

import Data.Char

main = do
   putStrLn("Different methods of Char Module")
   print(toUpper 'a')
   print(words "Let us study tonight")
   print(toLower 'A')

在這裏,toUppertoLower函數已在Char模組內部定義。執行上面代碼將產生以下輸出:

Different methods of Char Module
'A'
["Let","us","study","tonight"]
'a'

3. Map模組

Map是未排序的鍵-值對的類型數據。它是具有許多有用功能的廣泛使用的模組。以下示例顯示了如何使用Map模組中可用的預定義函數功能。

import Data.Map (Map)
import qualified Data.Map as Map  --required for GHCI

myMap :: Integer -> Map Integer [Integer]
myMap n = Map.fromList (map makePair [1..n])
   where makePair x = (x, [x])

main = print(myMap 3)

執行上面示例代碼,得到以下結果:

fromList [(1,[1]),(2,[2]),(3,[3])]

4. Set模組

Set模組中有一些非常有用的預定義函數來處理數學數據。集合實現為二叉樹,因此集合中的所有元素必須唯一。

看下麵的示例代碼:


import qualified Data.Set as Set

text1 = "Hey buddy"
text2 = "This tutorial is for Haskell"

main = do
   let set1 = Set.fromList text1
       set2 = Set.fromList text2
   print(set1)
   print(set2)

在這裏,我們將String修改為Set。它將產生以下輸出(輸出集沒有重複字元)
執行上面示例代碼,得到以下結果:

fromList " Hbdeuy"
fromList " HTaefhiklorstu"

5.自定義模組

下麵來看看如何創建一個可以在其他程式中調用的自定義模組。為了實現此自定義模組,將創建一個單獨的檔custom.hs以及main.hs。創建自定義模組:custom.hs,並在其中定義一些函數。

檔:custom.hs

module Custom (
   showEven,
   showBoolean
) where

showEven:: Int-> Bool
showEven x = do

if x 'rem' 2 == 0
   then True
else False
showBoolean :: Bool->Int
showBoolean c = do

if c == True
   then 1
else 0

上面的自定義模組已經編寫完成。接下來將它導入到程式中,如下代碼所示:

import Custom

main = do
   print(showEven 4)
   print(showBoolean True)

執行上面示例代碼,得到以下結果:

True
1

showEven函數返回True,因為4是一個偶數。所以showBoolean函數返回1,因為傳遞給該函數的參數值為True