在使用++运算符处理长字符串时要格外小心(对长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的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操作函数,我们会在往后的一节中了解更多的函数。
相关推荐
本文将基于《Haskell趣学指南》一书的目录,详细解析Haskell的各个方面,包括基础语法、类型系统、递归、高阶函数、模块系统、自定义类型和类型类、输入输出处理、函数式编程思维、以及高阶函数等特性。 ### 第一章...
Haskell趣学指南(台译版)Haskell趣学指南(台译版)Haskell趣学指南(台译版)
在《Haskell趣学指南》这本书中,作者M.Lipovaca提供了学习Haskell的全面指导,从零开始到深入理解函数式编程的高级特性,循序渐进地带读者进入Haskell编程的世界。书中详细介绍了Haskell的语法、数据类型、函数的...
【Haskell趣学指南】 Haskell是一种纯函数式编程语言,以其优雅的语法、静态类型系统和强大的类型推导机制而闻名。它鼓励编写不可变数据和无副作用的代码,从而提高了程序的可读性和可维护性。让我们通过以下几个...
haskell是一门纯函数式编程语言。在命令式语言中执行操作需要给电脑安排一组命令,随着命令的执行,状态就会随之发生改变。例如你给变量a赋值为5,而随后做了其它一些事情之后a就可能变成的其它值。有控制流程,你就...
Atom-ide-haskell-hoogle 是一个专门为 Atom 编辑器设计的插件,它整合了 Haskell 的 Hoogle 工具,以提供强大的代码提示和搜索功能。Atom 是一款由 GitHub 开发的开源文本编辑器,它利用现代 web 技术如 HTML、CSS ...
标题《haskell趣学指南 高清》以及描述内容表明这是一份针对Haskell编程语言的入门学习资料。该资料被推荐为“非常好的学习资料”,且指出它由知乎上的专家推荐,并强调了它的趣味性。标签“函数式”直接指出了...
stylish-haskell, Haskell代码 prettifier 时尚 haskell 简介简单的Haskell代码 prettifier 。 目标不是格式化文件中的所有代码,因为我发现这类工具经常是"别挡着路"。 然而,手动清理导入语句 等等 很快就会变得...
### Haskell简介与入门指南 **Haskell** 是一种纯函数式编程语言,它不依赖传统的命令式编程模型(如C、C++、Java和Python等),而是采用函数式编程范式。在Haskell中,计算过程是通过数学函数来表达的,变量一旦被...
**哈斯克尔编程语言与Atom-Haskell-GHC-Mod** 哈斯克尔(Haskell)是一种纯函数式编程语言,以其优雅的语法、强静态类型系统和编译时优化而受到程序员的喜爱。它鼓励使用不可变数据和惰性求值,这使得哈斯克尔在...
Atom-IDE-Haskell是专为Atom编辑器设计的一款强大的Haskell集成开发环境(IDE)插件。Atom是一款基于Web技术的开源文本编辑器,由GitHub开发,它支持自定义配置和丰富的插件生态系统,使开发者能够根据自己的需求...
### 函数式编程:Haskell到Java的转换 #### 概述 本文旨在探讨函数式编程语言Haskell如何被编译或转换为Java语言。Haskell作为一种纯函数式编程语言,以其强大的类型系统、惰性求值机制以及高度抽象的能力在学术界...
Atom-Haskell-Debug是针对Haskell开发者的一个强大工具,它允许你在流行的Atom文本编辑器中集成一个图形化的Haskell调试器。这个工具基于GHCi(Glasgow Haskell Compiler Interface),GHCi是Haskell的交互式环境,...
在"language-haskell-master"这个压缩包中,通常包含了以下内容: 1. `package.json`:这是Atom插件的核心配置文件,定义了插件的元数据,如名称、版本、依赖等,同时也指定了插件的激活命令和服务。 2. `lib`目录...