《Haskell趣学指南》笔记之模块

栏目: 编程语言 · 发布时间: 5年前

内容简介:系列文章目前我们提到的所有函数、type 和 typeclass 都是 Prelude 模块的一部分,默认情况下,Prelude 模块会被自动导入。导入之后,该模块的所有函数就都进入了『全局』命名空间。

系列文章

目前我们提到的所有函数、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
复制代码

自定义模块

普通模块

  1. 新建 Geometry.hs

  2. 写文件

    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)
    复制代码
  3. 在同一目录的其他文件里引入模块 import Geometry

有层次的模块

  1. 新建 Geometry 目录

  2. 在 Geometry 目录里面新建 Sphere.hs / Cuboid.hs / Cube.hs

  3. 这三个文件的内容类似这样

    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)
    复制代码
  4. 在 Geometry 目录的同级文件中导入模块 import Geometry.Sphere


以上所述就是小编给大家介绍的《《Haskell趣学指南》笔记之模块》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Algorithms on Strings, Trees and Sequences

Algorithms on Strings, Trees and Sequences

Dan Gusfield / Cambridge University Press / 1997-5-28 / USD 99.99

String algorithms are a traditional area of study in computer science. In recent years their importance has grown dramatically with the huge increase of electronically stored text and of molecular seq......一起来看看 《Algorithms on Strings, Trees and Sequences》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试