Haskell模块

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 '.' "zyiz.net") 
   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