`
willzh
  • 浏览: 300811 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

List入门-haskell趣学指南

阅读更多

List入门-haskell趣学指南

338个读者 ssword @ yeeyan.com 12/04/2008 双语对照   原文 字体大小

简介

一点关于haskell中List的内容

List入门
BUY A DOG
Haskell 中,List同现实世界中的购物单一样重要。它是最常用的数据结构,并且十分强大,灵活地使用它可以解决掉很多问题。在本节,我们将对List,字符串和list comprehension有个初步了解。

Haskell 中,List是一种单类型的数据结构,可以用来存储多个类型相同的元素。我们可以在里面装一组数字或者一组字符,但不能字符和数字装在一起。

note:在ghci下,我们可以使用let关键字来定义一个常量。在ghci下执行let a =1与在脚本中编写a=1是等价的。

ghci>  let  lostNumbers =  [4 ,8 ,15 ,16 ,23 ,48 ]  
ghci>  lostNumbers  
[4 ,8 ,15 ,16 ,23 ,48

如你所见,一个List由方括号括起,其中的元素用逗号分隔开来。若试图写[1,2,'a',3,'b','c',4]这样的List,Haskell 就会报出这几个字符不是数字的错误。字符串实际上就是一组字符的List,"Hello"只是 ['h','e','l','l','o']的语法糖而已。所以我们可以使用处理List的函数来对字符串进行操作。

将两个List合并是很常见的操作,这可以通过++运算符实现。

ghci>  [1 ,2 ,3 ,4 ] ++  [9 ,10 ,11 ,12 ]  
[1 ,2 ,3 ,4 ,9 ,10 ,11 ,12 ]  
ghci>  "hello"  ++  " "  ++  "world"   
"hello world"   
ghci>  ['w' ,'o' ] ++  ['o' ,'t' ]  
"woot"

在使用++运算符处理长字符串时要格外小心(对长List也是同样),Haskell 会遍历整个的List(++符号左边的那个)。在处理较短的字符串时 问题还不大,但要是在一个5000万长度的List上追加元素,那可得执行好一会儿了。所以说,用:运算符往一个List前端插入元素会是更好的选择。

ghci>   'A' : " SMALL CAT"   
"A SMALL CAT"   
ghci>   5 :[ 1 , 2 , 3 , 4 , 5 ]  
[5 , 1 , 2 , 3 , 4 , 5

:运算符可以连接一个元素到一个List或者字符串之中,而++运算符则是连接两个List。若要使用++运算符连接单个元素到一个List之中,就用方括号把它括起使之成为单个元素的List。

[1,2,3]实际上是1:2:3:[]的语法糖。[]表示一个空List,若要从前端插入3,它就成了[3],再插入2,它就成了[2,3],以此类推。

Note:[],[[]],[[],[],[]]是不同的。第一个是一个空的List,第二个是含有一个空List的List,第三个是含有三个空List的List。

若是要按照索引取得List中的元素,可以使用!!运算符,索引的下标为0。

ghci>   "Steve Buscemi"  !!  6   
'B'   
ghci>  [ 9.4 , 33.2 , 96.2 , 11.2 , 23.25 ] !!  1   
33.2  

但你若是试图在一个只含有4个元素的List中取它的第6个元素,就会报错。要小心!

List同样也可以用来装List,甚至是List的List的List:

ghci>   let  b  =  [[ 1 , 2 , 3 , 4 ],[ 5 , 3 , 3 , 3 ],[ 1 , 2 , 2 , 3 , 4 ],[ 1 , 2 , 3 ]]  
ghci>  b  
[[1 , 2 , 3 , 4 ],[ 5 , 3 , 3 , 3 ],[ 1 , 2 , 2 , 3 , 4 ],[ 1 , 2 , 3 ]]  
ghci>  b  ++  [[ 1 , 1 , 1 , 1 ]]  
[[1 , 2 , 3 , 4 ],[ 5 , 3 , 3 , 3 ],[ 1 , 2 , 2 , 3 , 4 ],[ 1 , 2 , 3 ],[ 1 , 1 , 1 , 1 ]]  
ghci>  [ 6 , 6 , 6 ]:b  
[[6 , 6 , 6 ],[ 1 , 2 , 3 , 4 ],[ 5 , 3 , 3 , 3 ],[ 1 , 2 , 2 , 3 , 4 ],[ 1 , 2 , 3 ]]  
ghci>  b !!  2   
[1 , 2 , 2 , 3 , 4 ]  

List中的List可以是不同长度,但必须得是相同的类型。如不可以在List中混合放置字符和数组相同,混合放置数值和字符的List也是同样不可以的。

当List内装有可比较的元素时,使用 < , <= , >>=可以比较List的大小。它会先比较第一个元素,若它们的值相等,则比较下一个,以此类推。


ghci>  [ 3 , 2 , 1 ]  >  [ 2 , 1 , 0 ]  
True   
ghci>  [ 3 , 2 , 1 ]  >  [ 2 , 10 , 100 ]  
True   
ghci>  [ 3 , 4 , 2 ]  >  [ 3 , 4 ]  
True   
ghci>  [ 3 , 4 , 2 ]  >  [ 2 , 4 ]  
True   
ghci>  [ 3 , 4 , 2 ]  ==  [ 3 , 4 , 2 ]  
True  


还可以对LIst做啥?如下是几个常用的函数:

head返回一个List的头部,也就是List的首个元素。

ghci>  head [ 5 , 4 , 3 , 2 , 1 ]  
5   

tail返回一个LIst的尾部,也就是List除去头部之后的部分。


ghci>  tail [ 5 , 4 , 3 , 2 , 1 ]  
[4 , 3 , 2 , 1 ]  

last返回一个LIst的最后一个元素。


ghci>  last [ 5 , 4 , 3 , 2 , 1 ]  
1   

init返回一个LIst出去最后一个元素的部分。

ghci>  init [ 5 , 4 , 3 , 2 , 1 ]  
[5 , 4 , 3 , 2 ]  

 

如果我们把List当做一头怪兽,那这就是它的样子:

list monster

试一下,若是取一个空List的head又会怎样?

ghci>  head []  
*** Exception Prelude .head: empty list 

omg,它翻脸了!怪兽压根就不存在,head又从何而来?在使用head,tail,last和init时要小心别用到空的List上,这个错误不会在编译时被捕获。所以说做些工作以防止从空List中取值会是个好的做法。

length返回一个List的长度。

ghci>  length [ 5 , 4 , 3 , 2 , 1 ]  
5  

null检查一个List是否为空。如果是,则返回True,否则返回False。应当避免使用xs==[]之类的语句来判断List是否为空,使用null会更好。

ghci>  null [ 1 , 2 , 3 ]  
False   
ghci>  null []  
True  

reverse将一个List反转

ghci>  reverse [ 5 , 4 , 3 , 2 , 1 ]  
[1 , 2 , 3 , 4 , 5

take返回一个List的前几个元素,看:

ghci>  take  3  [ 5 , 4 , 3 , 2 , 1 ]  
[5 , 4 , 3 ]  
ghci>  take  1  [ 3 , 9 , 3 ]  
[3 ]  
ghci>  take  5  [ 1 , 2 ]  
[1 , 2 ]  
ghci>  take  0  [ 6 , 6 , 6 ]  
[] 

如上,若是图取超过List长度的元素个数,只能得到原List。若take 0个元素,则会得到一个空List!

drop与take的用法大体相同,它会删除一个List中的前几个元素。

ghci>  drop  3  [ 8 , 4 , 2 , 1 , 5 , 6 ]  
[1 , 5 , 6 ]  
ghci>  drop  0  [ 1 , 2 , 3 , 4 ]  
[1 , 2 , 3 , 4 ]  
ghci>  drop  100  [ 1 , 2 , 3 , 4 ]  
[]  

maximum返回一个List中最大的那个元素。

miniimun返回最小的。

ghci>  minimum [ 8 , 4 , 2 , 1 , 5 , 6 ]  
1   
ghci>  maximum [ 1 , 9 , 2 , 3 , 4 ]  
9   

sum返回一个List中所有元素的和。

product返回一个List中所有元素的积。

ghci>  sum [ 5 , 2 , 1 , 6 , 3 , 2 , 5 , 7 ]  
31   
ghci>  product [ 6 , 2 , 1 , 2 ]  
24   
ghci>  product [ 1 , 2 , 5 , 6 , 7 , 9 , 2 , 0 ]  
0   

elem判断一个元素是否在包含于一个List,通常以中缀函数的形式调用它。

ghci>   4   `elem`  [ 3 , 4 , 5 , 6 ]  
True   
ghci>   10   `elem`  [ 3 , 4 , 5 , 6 ]  
False  

这就是几个基本的List操作函数,我们会在往后的一节中了解更多的函数。
分享到:
评论

相关推荐

    B10-Haskell趣学指南.pdf

    本文将基于《Haskell趣学指南》一书的目录,详细解析Haskell的各个方面,包括基础语法、类型系统、递归、高阶函数、模块系统、自定义类型和类型类、输入输出处理、函数式编程思维、以及高阶函数等特性。 ### 第一章...

    Haskell趣学指南(台译版)

    Haskell趣学指南(台译版)Haskell趣学指南(台译版)Haskell趣学指南(台译版)

    Haskell趣学指南---文字版.pdf

    在《Haskell趣学指南》这本书中,作者M.Lipovaca提供了学习Haskell的全面指导,从零开始到深入理解函数式编程的高级特性,循序渐进地带读者进入Haskell编程的世界。书中详细介绍了Haskell的语法、数据类型、函数的...

    haskell趣学指南

    【Haskell趣学指南】 Haskell是一种纯函数式编程语言,以其优雅的语法、静态类型系统和强大的类型推导机制而闻名。它鼓励编写不可变数据和无副作用的代码,从而提高了程序的可读性和可维护性。让我们通过以下几个...

    A HASKELL 趣学指南

    haskell是一门纯函数式编程语言。在命令式语言中执行操作需要给电脑安排一组命令,随着命令的执行,状态就会随之发生改变。例如你给变量a赋值为5,而随后做了其它一些事情之后a就可能变成的其它值。有控制流程,你就...

    Atom-ide-haskell-hoogle,在光标下显示符号的滚动信息。对原子的贡献.zip

    Atom-ide-haskell-hoogle 是一个专门为 Atom 编辑器设计的插件,它整合了 Haskell 的 Hoogle 工具,以提供强大的代码提示和搜索功能。Atom 是一款由 GitHub 开发的开源文本编辑器,它利用现代 web 技术如 HTML、CSS ...

    haskell趣学指南 高清

    标题《haskell趣学指南 高清》以及描述内容表明这是一份针对Haskell编程语言的入门学习资料。该资料被推荐为“非常好的学习资料”,且指出它由知乎上的专家推荐,并强调了它的趣味性。标签“函数式”直接指出了...

    stylish-haskell, Haskell代码 prettifier.zip

    stylish-haskell, Haskell代码 prettifier 时尚 haskell 简介简单的Haskell代码 prettifier 。 目标不是格式化文件中的所有代码,因为我发现这类工具经常是"别挡着路"。 然而,手动清理导入语句 等等 很快就会变得...

    Haskell趣味学习中文版

    ### Haskell简介与入门指南 **Haskell** 是一种纯函数式编程语言,它不依赖传统的命令式编程模型(如C、C++、Java和Python等),而是采用函数式编程范式。在Haskell中,计算过程是通过数学函数来表达的,变量一旦被...

    Atom-haskell-ghc-mod,哈斯克尔.zip

    **哈斯克尔编程语言与Atom-Haskell-GHC-Mod** 哈斯克尔(Haskell)是一种纯函数式编程语言,以其优雅的语法、强静态类型系统和编译时优化而受到程序员的喜爱。它鼓励使用不可变数据和惰性求值,这使得哈斯克尔在...

    Atom-ide-haskell,用于Atom编辑器的Haskell IDE插件。对原子的贡献.zip

    Atom-IDE-Haskell是专为Atom编辑器设计的一款强大的Haskell集成开发环境(IDE)插件。Atom是一款基于Web技术的开源文本编辑器,由GitHub开发,它支持自定义配置和丰富的插件生态系统,使开发者能够根据自己的需求...

    函数式编程-haskell-to-java

    ### 函数式编程:Haskell到Java的转换 #### 概述 本文旨在探讨函数式编程语言Haskell如何被编译或转换为Java语言。Haskell作为一种纯函数式编程语言,以其强大的类型系统、惰性求值机制以及高度抽象的能力在学术界...

    Atom-haskell-debug,使用ghci在atom中实现图形haskell调试器.zip

    Atom-Haskell-Debug是针对Haskell开发者的一个强大工具,它允许你在流行的Atom文本编辑器中集成一个图形化的Haskell调试器。这个工具基于GHCi(Glasgow Haskell Compiler Interface),GHCi是Haskell的交互式环境,...

    Atom-language-haskell,haskell语言对atom的支持。对原子的贡献.zip

    在"language-haskell-master"这个压缩包中,通常包含了以下内容: 1. `package.json`:这是Atom插件的核心配置文件,定义了插件的元数据,如名称、版本、依赖等,同时也指定了插件的激活命令和服务。 2. `lib`目录...

Global site tag (gtag.js) - Google Analytics