Data.ByteString

String 是 [Char] 的同义词,在使用上存在List的惰性所带来的性能问题。

在处理大型二进制文件时,可以使用 ByteString 来代替 String。

ByteString 类型分为以下两种:

  • Lazy 模块 Data.ByteString.Lazy 中的 Data.ByteString.Lazy.ByteString

    Lazy 模块内部使用 chunks(64K数据块)。
  • Strict 模块 Data.ByteString 中的 Data.ByteString.ByteString
  1. Prelude> import qualified Data.ByteString.Lazy as B
  2. Prelude B> import qualified Data.ByteString as S
  3. Prelude B S> B.pack [99,97,110]
  4. "can"
  5. Prelude B S> B.fromChunks [S.pack [40,41,42], S.pack [43,44,45], S.pack [46,47,48]]
  6. "()*+,-./0"
  7. Prelude B S> B.cons 85 $ B.pack [80,81,82,84]
  8. "UPQRT"
  9. Prelude B S> foldr B.cons' B.empty [50..60]
  10. "23456789:;<"

Data.Text

在处理大型文本文件时,可以使用 Text 来代替 String。

Text 是一个 Unicode 友好的字符串类型。

Text 类型分为以下两种:

  • Lazy 模块 Data.Text.Lazy 中的 Data.Text.Lazy.Text

    Lazy 模块内部使用 chunks。
  • Strict 模块 Data.Text 中的 Data.Text.Text
  1. Prelude> import qualified Data.Text.Lazy as T
  2. Prelude T> :t T.pack "abc"
  3. T.pack "abc" :: T.Text
  4. Prelude T> T.replace (T.pack "a") (T.pack "b") (T.pack "aXaXaX")
  5. "bXbXbX"
  6. Prelude T> T.splitOn (T.pack "a") (T.pack "aXaXaX")
  7. ["","X","X","X"]
  • pack :: String -> Text

    pack 函数将 String 转换成 Text。

Data.Text.Encoding

Encoding 模块用于 ByteString 和 Text 之间类型转换。

Text 包含 Lazy 模块 Data.Text.Encoding.Lazy 和 Strict 模块 Data.Text.Encoding。

其中 Lazy 模块提供 Data.ByteString.Lazy.ByteString 和 Data.Text.Lazy.Text 之间的类型转换功能。

而 Strict 模块则提供 Data.ByteString.ByteString 和 Data.Text.Text 之间的类型转换功能。

Data.String.Conversions

  1. $ cabal install string-conversions
  2. Installed string-conversions-0.4.0.1
  3. Prelude> :m +Data.String.Conversions
  4. Prelude Data.String.Conversions>

Conversions 模块提供以下五种类型之间的类型转换功能。

  • String
  • Data.ByteString.ByteString

    缩写为 StrictByteString 或 SBS
  • Data.ByteString.Lazy.ByteString

    缩写为 LazyByteString 或 LBS
  • Data.Text.Text

    缩写为 StrictText 或 ST
  • Data.Text.Lazy.Text

    缩写为 LazyText 或 LT
  1. Prelude Data.String.Conversions> cs "abc" :: ST
  2. "abc"
  • ConvertibleStrings

    ConvertibleStrings 是个类型类,五种字符串类型都被定义成了 ConvertibleStrings 类型类的实例。
  • cs :: ConvertibleStrings a b => a -> b

    cs 函数根据输入输出类型自动实施五种字符串类型之间的类型转换功能。

OverloadedStrings

GHC 提供了语言扩展 OverloadedStrings。

  • 不使用这个语言扩展,所有的字符串字面量都属于 String 也就是 [Char] 类型。
  • 如果使用这个语言扩展,那么所有的字符串字面量就都属于 IsString a => a 类型。
  • String, ByteString, Text 都是 IsString 类的实例。
  1. Module Data.String
  2. class IsString a where
  3. fromString :: String -> a
  1. {-# LANGUAGE OverloadedStrings #-}
  2. import qualified Data.Text.IO as T
  3. a :: Text
  4. a = "Hello World"
  5. b :: ByteString
  6. b = "Hello World"
  7. c :: String
  8. c = "Hello World"
  9. main = do putStrLn "Hello as String!"
  10. T.putStrLn "Hello as Text!"

Text 是 Monoid

  1. Prelude Data.Text> ("abc" :: Text) <> ("def" :: Text)
  2. "abcdef"

Haskell语言学习笔记(49)ByteString Text的更多相关文章

  1. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  2. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  5. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  6. Haskell语言学习笔记(93)Data.Text

    Data.Text.Read Prelude> :set -XOverloadedStrings Prelude> :m +Data.Text.Read Prelude Data.Text ...

  7. Haskell语言学习笔记(92)HXT

    HXT The Haskell XML Toolbox (hxt) 是一个解析 XML 的库. $ cabal install hxt Installed hxt-9.3.1.16 Prelude&g ...

  8. Haskell语言学习笔记(89)Unicode UTF8

    unicode-show $ cabal install unicode-show Installed unicode-show-0.1.0.2 Prelude> :m +Text.Show.U ...

  9. Haskell语言学习笔记(86)字符串格式化与插值

    String 的格式化 Text.Printf 这个模块用来处理字符串格式化. printf :: PrintfType r => String -> r printf 用于格式化字符串, ...

随机推荐

  1. MVC ASP.NET MVC各个版本的区别 (转)

    Net Framework4.5是不支持安装在window server 2003上,如非装请用net framework4.0; MVC1.0 publsh time:2008 IDEV:VS200 ...

  2. 转【Oracle】一款非常好用的trace文件分析工具

    [Oracle]一款非常好用的trace文件分析工具之一   北在南方 2016-04-14 11:23:58 浏览547 评论0 摘要: 介绍一款非常好用的10046分析工具--trca(Trace ...

  3. JQuery返回Json日期格式的問題

    用JQuery Ajax返回一個Entity的Json數據時,如果Entity的屬性中有日期格式,那返回來的是一串字符串,如下圖所示: 在網上找了很久也沒有找到一個好的解決方案,最後自己寫一個java ...

  4. JAVA课程设计——多源教学数据管理系统

    团队简介 团队名称: 419圣斗士 团队成员 姓名 成员介绍 任务分配 周炳辉(组长) 来自网络的一个大佬,穿女装很合适 poi与servlet 徐宏伟 网络中一个具有强大隐藏实力的大哥 css,部分 ...

  5. 接口测试maven管理

    接口测试框架选择 界面化工具,针对不会编码的测试人员: 1.Jmeter性能测试工具,不具备完备的接口测试框架功能 2.Robotframerwork 3.PostMan 推荐框架: ResrAssu ...

  6. 从Tomcat无法正常关闭讲讲Java线程关闭问题【转载】

    正常情况下,会优先采用catalina.sh stop来停止Tomcat实例,这样可以让服务有机会处理完请求,并做好善后工作. 但如果通过catalina.sh stop命令无法关闭Tomcat实例, ...

  7. 深入理解HTTP协议之POST方法——ajax实例

    作者:吴俊杰 性别:男 邮箱:sshroot@126.com 文章类型:原创 博客:http://www.cnblogs.com/voiphudong/ 一.说明http协议其实是一个相对比较简单的应 ...

  8. linux下一个监测进程CPU和MEM使用率的shell脚本

    #!/bin/bashPID=$1 cpu=`ps --no-heading --pid=$PID -o pcpu`mem=`ps --no-heading --pid=$PID -o pmem`ec ...

  9. javascript 中的函数声明和函数表达式区别

    函数声明格式: function add(a, b) { alert(a+b); } 函数表达式格式: var add = function (a, b) { alert(a+b); } 解析器在向环 ...

  10. 【Linux_Unix系统编程】chapter6 进程

    chapter6 进程 重点关注进程虚拟内存的布局及内容.6.1 进程和程序 进程(process)是一个可执行程序(program)的实例. 程序是包含了一系列信息的文件,这些信息描述了如何在运行时 ...