懂一点Haskell(三)

作者: 九十九度中 | 来源:发表于2019-01-22 00:03 被阅读1次

lists在概念上是递归的。一个lists要么为空,要么为另一个lists加上一个元素。

build a list

ghci> 1:[]
[1]
ghci> 1:[2,3,4]
[1,2,3,4]

值得注意的是,在Haskell中,字符串就只是字符的列表而已。

ghci> 'h':'e':'l':'l':'o':[]
"hello"
ghci> 'h':"ello"
"hello"

但是ghci> "h":"ello"就会报错。事实上,在Haskell总,所有的lists都是以这种冒号连接的形式存储的,[. . .]这种形式只是语法糖而已。

-- "h"  is  ['h']
-- "ello" is ['e','l','l','o']

-- 两个列表可以使用++运算符联合

ghci> "h" ++ "ello"
"hello"
ghci> [1] ++ [2,3,4]
[1,2,3,4]

关于惰性求值

ghci> [1 .. 10]
[1,2,3,4,5,6,7,8,9,10]
ghci> [1,3 .. 10]
[1,3,5,7,9]
ghci> [1 .. ]
[1,2,3,4,5,6,7,8,9,10,11,12 ..

--它生成了一个无限长的列表!

这就引出了Haskell中一个重要的特性,惰性求值,你可以在函数中使用这个无限长的列表而不会编译报错,因为程序只会在你需要值的时候才进行求值!虽然惰性求值会给你编写程序带来一定的方便,但我觉得它同时会带来性能方面的劣势。

list上常用的函数

headtail,head取一个列表的第一个元素,tail取除过第一个元素剩下的元素。

ghci> head [1,2,3]
1
ghci> head [[1,2], [3,4], [5,6]]
[1,2]
ghci> tail [1,2,3]
[2,3]
ghci> tail [3]
[]
-- []列表和其它列表不同,对空列表调用head或者tail程序会报错。

!!运算符,取列表的特定下标值。

ghci> [1,2,3] !! 0
1
ghci> [1 .. 10] !! 3
4
ghci> (!!) [1,2,3] 0
1
-- 中缀运算符可以加上括号变为前缀运算符。

lengthreverseelem

ghci> length [1 .. 20]
20
ghci> reverse [1,2,3]
[3,2,1]
ghci> elem 13 [1,13 .. 100]
True
ghci> elem 2 [1,3,5]
False
ghci> 8 `elem` [3,5,7]
False

take and drop

ghci> take 5 [2,4 .. ]
[2,4,6,8,10]
ghci> take 3 "wonderful"
"won"
ghci> take 10000 [1]
[1]
ghci> drop 2 [1,2,3,4,5]
[3,4,5]

zip

ghci> zip [1,2,3] [4,5,6]
[(1,4), (2,5), (3,6)]
ghci> zip "dog" "rabbit"
[('d','r'), ('o','a'), ('g','b')]

cycle ,它使用惰性求值创造了一个无穷序列,给一个列表,cycle重复这个列表直到无穷无尽!

ones n = take n (cycle [1])
ghci> ones 4
[1,1,1,1]
ghci> ones 2
[1,1]

相关文章

  • 懂一点Haskell(三)

    lists在概念上是递归的。一个lists要么为空,要么为另一个lists加上一个元素。 build a list...

  • 懂一点Haskell(一)

    Getting Started 当我们接触一门新语言,第一件事就是写出相应版本的Hello world。那么,让我...

  • 懂一点Haskell(二)

    函数式编程基础 编程有两种根本不同的方式,顺序式和函数式。顺序式最好的例子是C语言,它依赖于一个特定的模型,比如冯...

  • 函数式的宗教-00: 认识lisp(clojure)与haske

    总体大纲: lisp与haskell简单介绍 lisp与haskell应用领域 lisp与haskell技术分析 ...

  • Haskell(三)递归

    递归 使用递归求List中得最大值,先设置边界条件,如果List为空,则运行异常,如果List只有一个元素,直接返...

  • monad以及monad的四条定理

    haskell的范畴是hask范畴(haskell的所有类型隶属于hask范畴),所以haskell的所有函子都是...

  • 01 数据类型

    swift中结构体在haskell中的描述 枚举类型在haskell中的描述 枚举携带类型在haskell中描述 ...

  • Haskell学习-函数式编程初探

    原文地址:Haskell学习-函数式编程初探  为什么要学习函数式编程?为什么要学习Haskell?  .net到...

  • Haskell

    [TOC] Haskell GHCI 通过Tab可以自动补全 通过 :browser 模块名称,浏览该模块下的函数...

  • haskell

    我在这里只是表达此刻内心想到的一些事情,或者记录自己关于最近学习生活工作的想法。 从我这一周对haskell的学习...

网友评论

    本文标题:懂一点Haskell(三)

    本文链接:https://www.haomeiwen.com/subject/ziskjqtx.html