系列文章
- 《Haskell趣學指南》筆記之基本語法
- 《Haskell趣學指南》筆記之型別(type)
- 《Haskell趣學指南》筆記之函式
- 《Haskell趣學指南》筆記之高階函式
- 《Haskell趣學指南》筆記之模組
- 《Haskell趣學指南》筆記之自定義型別
目前我們提到的所有函式、type 和 typeclass 都是 Prelude 模組的一部分,預設情況下,Prelude 模組會被自動匯入。
匯入模組
import ModuleName-- 匯入模組的語句必須防止在函式定義之前
import Data.List (nub, sort) -- 只匯入兩個函式
import Data.List hiding (nub) -- 不匯入 nub
import qualified Data.Map -- 只能使用 Data.map.xxx 來使用函式
import qualified Data.Map as M -- 只能使用 M.xxx 來使用函式
複製程式碼
匯入之後,該模組的所有函式就都進入了『全域性』名稱空間。
要檢視函式位於哪個模組,可以用 Hoogle (www.haskell.org/hoogle/)。
在 GHCi 中匯入模組的語句是:
ghci> :m + Data.List Data.Map Date.Set
複製程式碼
細節:點號既可以用於名稱空間,又可以用於組合。怎麼區分呢?當點號位於限定匯入的模組名與函式中間且沒有空格時,會被視作函式引用; 否則會被視作函式組合。
Data.List 模組
- words -- 取出字串裡面的單詞,組成字串列表
- group / sort / tails / isPrefixOf / any / isInfixOf 是否含於
- foldl' 不延遲的 foldl
- find / lookup
例子:
import Data.List
wordNums :: String -> [(String, Int)]
wordNums = map (\ws -> (head ws, length ws)) . group . sort . words
複製程式碼
Data.Char 模組
- ord 'a' -- 97
- chr 97 -- 'a'
Maybe 型別
findKey :: (Eq k) => k -> [(k, v)] -> Maybe v
findKey key [] = Nothing
findKey key ((k, v): xs)    
| key == x = Just v    
| otherwise = findKey key xs
複製程式碼
注意 Maybe / Nothing / Just 這三個東西。
Data.Map 模組
- API: fromList / insert / size / fromListWith
使用示例
import qualified Data. Map as Map
phoneBook :: Map. Map String String
phoneBook = Map. fromList $    
[(" betty", "555- 2938")    
,(" bonnie", "452- 2928")    
,(" patsy", "493- 2928")    
,(" lucille", "205- 2928")    
,(" wendy", "939- 8282")    
,(" penny", "853- 2492")]
ghci> :t Map. lookup
Map. lookup :: (Ord k) => k -> Map. Map k a -> Maybe a
ghci> Map. lookup "betty" phoneBook
Just "555- 2938"
ghci> Map. lookup "wendy" phoneBook
Just "939- 8282"
ghci> Map. lookup "grace" phoneBook
Nothing
複製程式碼
自定義模組
普通模組
-
新建 Geometry.hs
-
寫檔案
module Geometry ( sphereVolume , sphereArea ) where sphereVolume :: Float -> Float sphereVolume radius = (4.0 / 3.0) * pi * (radius ^ 3) sphereArea :: Float -> Float sphereArea radius = 4 * pi * (radius ^ 2) 複製程式碼
-
在同一目錄的其他檔案裡引入模組
import Geometry
有層次的模組
-
新建 Geometry 目錄
-
在 Geometry 目錄裡面新建 Sphere.hs / Cuboid.hs / Cube.hs
-
這三個檔案的內容類似這樣
module Geometry.Sphere ( volume , area ) where volume :: Float -> Float volume radius = (4.0 / 3.0) * pi * (radius ^ 3) area :: Float -> Float area radius = 4 * pi * (radius ^ 2) 複製程式碼
-
在 Geometry 目錄的同級檔案中匯入模組
import Geometry.Sphere