首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在purescript中模式匹配表头和表尾

在 PureScript 中,可以使用模式匹配来提取列表的表头和表尾。

要模式匹配列表的表头和表尾,可以使用 case 表达式或者函数定义中的模式匹配。

使用 case 表达式的示例代码如下:

代码语言:txt
复制
import Data.List (List(..))

headAndTail :: forall a. List a -> Maybe (a, List a)
headAndTail xs = case xs of
  Nil -> Nothing
  Cons x xs' -> Just (x, xs')

在上面的代码中,List 是一个代表列表的数据类型,Nil 表示空列表,Cons 表示非空列表,其中 x 是表头元素,xs' 是表尾列表。

使用函数定义中的模式匹配的示例代码如下:

代码语言:txt
复制
import Data.List (List(..))

headAndTail :: forall a. List a -> Maybe (a, List a)
headAndTail Nil = Nothing
headAndTail (Cons x xs) = Just (x, xs)

在上面的代码中,函数定义中的模式匹配与 case 表达式中的模式匹配是等价的。

这个函数的类型签名是 forall a. List a -> Maybe (a, List a),表示接受一个列表作为参数,并返回一个 Maybe 类型的值,其中包含表头元素和表尾列表。如果传入的列表是空列表,则返回 Nothing,否则返回 Just (x, xs'),其中 x 是表头元素,xs' 是表尾列表。

这个函数的应用场景是在处理列表时,需要获取列表的表头和表尾进行进一步的操作,例如递归处理列表的每个元素。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 人工智能平台(AI Lab):https://cloud.tencent.com/product/ailab
  • 物联网开发平台(IoT Explorer):https://cloud.tencent.com/product/iothub
  • 移动推送服务(信鸽):https://cloud.tencent.com/product/tpns
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 区块链服务(TBC):https://cloud.tencent.com/product/tbc
  • 腾讯云元宇宙:https://cloud.tencent.com/solution/virtual-universe
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Redis源码学习之链表

,pre指针指向其前置节点,next指针指向其后置节点,表头节点的pre属性节点的next属性为nil,节点值的类型为interface{},从而达到保存不同类型值的目的。...前置节点 next *listNode //后置节点 value interface{} //节点值 } 链表结构 通过list结构持有链表,其中head、tail属性分别指向表头节点...//持有链表结构 type list struct { //指向表头节点 head *listNode //指向节点 tail *listNode //记录链表长度 length...属性以及表头属性的维护 if after { //插入节点到oldNode节点后,即oldNode.next = node node.pre = oldNode node.next =...<= 1 { return } //取出 tail := l.tail l.tail = tail.pre l.tail.next = nil //将插到表头 tail.next

63500

2、Redis数据结构——链表-linkedlist

链表数据结构: typedef struct list { listNode *head; // 表头节点 listNode *tail; // 节点 unsigned...; match函数则用于对比链表结点所保存的值另一个输入值是否相等; 2、特性: 双端:链表结点带有prevnext指针,获取某个节点前置节点后置节点复制度都是O(1) 无环:表头结点的prev指针结点的...带表头指针指针:获取表头节点节点复制度O(1) 带链表长度计数器:len属性对list持有的链表节点进行计数,获取节点数量复制度O(1) 多态:使用void* 指针保存节点值,通过list结构的...重点回顾 链表被广泛用于实现Redis各种功能,列表键、发布订阅、慢查询等 每个链表结点由一个listNode结构来表示,每个节点都有一个指向前置节点后置节点的指针,所以Redis的链表实现是双端链表...每个链表用一个list结构表示,这个结构带有表头节点指针、节点指针以及链表长度等信息。 因为链表表头前置节点后置节点都指向NULL,所以Redis的链表实现是无环链表。

33500

Redis的双向链表一文全知道

马上要开启爆更模式啦。在Redis链表List的应用非常广泛,但是Redis是采用C语言来写,底层采用双向链表实现(这边提一嘴,如果是科班出身或者大学有学过数据结构的同学,可以划走啦)。...其为count,表示移除列表与a相等的元素个数。即如果count>0,表示从表头开始向搜索,移除count个与a相等的元素。...如果count<0,表示从开始向表头搜索,移除count个与a相等的元素。如果count=0,移除所有与a相等的元素,因为是移除所有,所以不管从表头还是,结果是一样的。 ​...每个节点都有两个指针,既能从表头根据指针找到,又能从根据头指针prev找到表头,如果将他们连起来,就构成了双向链表。 ​...的头指针指针,最后针对list的往表头插入元素,往插入元素,删除,修改等方法进行源码解析,使其对双向链表有更清晰的认识。

2.2K30

Redis 数据结构 skiplist

结构则用于保存跳跃节点的相关信息, 比如节点的数量, 以及指向表头节点节点的指针, 等等。...后退指针在程序从表头遍历时使用。 分值(score):各个节点中的 1.0 、 2.0 3.0 是节点所保存的分值。在跳跃,节点按各自所保存的分值从小到大排列。...图 5-3 用虚线表示出了程序从表头方向, 遍历跳跃中所有节点的路径: 迭代程序首先访问跳跃的第一个节点(表头), 然后从第四层的前进指针移动到的第二个节点。...// 节点的数量 unsigned long length; // 中层数最大的节点的层数 int level; } zskiplist; header tail 指针分别指向跳跃表头节点..., 通过这两个指针, 程序定位表头节点节点的复杂度为 O(1) 。

39630

基础大扫荡——背包,栈,队列,链表一口气全弄懂

提到数据结构,不得不说数据类型,有人将他们比作分子原子的关系,我们都知道大自然最小的构成单位是原子,数据类型描述的是原子的内部,质子、中子的情况,而数据结构是分子,由不同的原子以各种各样的结构组成。...在入列出列的操作过程,frontrear的值会越来越大,这个大是没意义的,但会超过size值引发问题,所以我们要用相对位置, 1 front++ 改为 front = (front + 1) %...再重申一下这三种数据结构在存取顺序上,各自的关注点, 背包是不关注顺序,只存不取; 栈是只关注最顶部元素位置,支持存取; 队列是要同时关注队首两个位置,支持存取。...= node; 从插入,稍微复杂一点,我们要先用循环找到节点(节点的特点是他的link为null),找到以后,将节点的link从null修改为新增节点,然后新增节点的link设置为null...表头插入,表头取出,就实现了栈 表头取出,插入,就实现了队列 背包只要插入,无所谓表头插入还是插入。

732150

《闲扯Redis十》Redis 跳跃的结构实现

结构则用于保存跳跃节点的相关信息,比如节点的数量,以及指向表头节点节点的指针等。...后退指针在程序从表头遍历时使用。 分值(score):各个节点中的 1.0 、 2.0 3.0 是节点所保存的分值。在跳跃,节点按各自所保存的分值从小到大排列。...图 5-3 用虚线表示出了程序从表头方向,遍历跳跃中所有节点的路径: ? 迭代程序首先访问跳跃的第一个节点(表头), 然后从第四层的前进指针移动到的第二个节点。...header tail 指针分别指向跳跃表头节点,通过这两个指针,程序定位表头节点节点的复杂度为 O(1) 。...通过跳跃表头节点节点, 这个检测可以用 O(1) 复杂度完成。 zslFirstInRange 给定一个分值范围, 返回跳跃第一个符合这个范围的节点。

81320

数据结构之循环队列C语言实现(详细)

输入端称为队,输出端称为队头 因此,队列,又称为先进先出(FIFO),类似于生活的排队,先来的排在前头,后来的排在后头,一个一个办理业务。...那么在使用过程,我们是从后面加入数据,从前面移除数据。那么随着出队入队的进行,数组会整体向右平移,因为数组前面的元素因为出队变成了空白,变得不可使用。造成空间的浪费。...综上,我们使用循环队列,就是将队首黏在一起。类似于一个⚪; 那么知道了循环数组后,我们应该考虑下,队首怎么放置,才能使我们循环队列能够使用。...不同的队首的初始化,将导致我们判断队列是否已满以及队列是否为空的方法的不同。 (1)front(队首)rear(队)初始化均为0。...另外,如何在代码实现过程中将正常数组变成循环数组呢?

62730

Redis面试(三):底层数据结构(二)

节点 unsigned long length;// 节点数量 int level;// 中层数最大的节点的层数 } zskiplisheadertail指针分别指向跳跃表头节点...,通过这两个指针,程序定位表头节点节点的复杂度为O(1)。...节点的后退指针(backward属性)用于从表头方向访问节点跟可以一次跳过多个节点的前进指针不同,因为每个节点只有一个后退指针,所以每次只能后退至前一个节点。...level[i].forward:每个层都有一个指向方向的前进指针(level[i].forward属性),用于从表头方向访问节点level[i].span:表示节点x在第i层到其下一个节点需跳过的节点数...建立公共溢出区(Overflow Area)将哈希分为基本溢出两部分,凡是基本发生冲突的元素,一律填入溢出。这个溢出区可以是一个单独的数据结构,链表或树。

25440

Redis的设计与实现(4)-跳跃

跨度用来计算排位 (rank) : 在查找某个节点的过程, 将沿途访问过的所有层的跨度累计起来, 得到的结果就是目标节点在跳跃的排位. 1.4 后退指针 节点的后退指针 (backward) 用于从表头方向访问节点...跳跃 使用一个 zskiplist 结构来持有节点, 可以更方便地访问跳跃表头节点节点, 又或者快速地获取跳跃节点 的数量 (也即是跳跃的长度) 等信息. zskiplist 结构的定义如下...; // 节点的数量 unsigned long length; // 中层数最大的节点的层数 int level; } zskiplist; header tail 指针分别指向跳跃表头节点..., 程序定位表头节点节点的复杂度为 O(1) . length 属性记录节点的数量, 可在 O(1) 复杂度内返回跳跃的长度. level 则用于在 O(1) 复杂度内获取跳跃中层高最大的那个节点的层数量...通过跳跃表头节点节点, 这个检测可以用 O(1) 复杂度完成. zslFirstInRange 给定一个分值范围, 返回跳跃第一个符合这个范围的节点.

22810

Redis的设计与实现(2)-链表

len 分别是表头指针节点数量, 而 dup, free match 则是用于实现多态链表所需的类型特定函数: dup 函数用于复制链表节点所保存的值; free 函数用于释放链表节点所保存的值...将链表的节点弹出, 然后将被弹出的节点插入到链表的表头, 成为新的表头节点 O(1) listDup 复制一个给定链表的副本 O(N), N 为链表长度 listRelease 释放给定链表, 以及链表的所有节点...总结 双端: 节点带有 prev next 指针, 获取其前置后置节点的复杂度都是 O(1); 无环: 表头节点的 prev 指针节点的 next 指针都指向 NULL, 对链表的访问以 NULL...为终点; 带表头指针指针: 通过 list 结构的 head 指针 tail 指针, 获取表头节点的复杂度为 O(1); 带链表长度计数器: 通过 list 结构的 len 属性, 程序获取链表节点数量的复杂度为..., 所以 Redis 的链表实现是双端链表; 每个链表使用一个 list 结构来表示, 这个结构带有表头节点指针, 节点指针, 以及链表长度等信息; 因为链表表头节点的前置节点节点的后置节点都指向

11810

5、Redis数据结构——跳跃-skiplist

,比如节点数量,以及表头节点节点的指针等。...后退指针用于表头遍历使用。 3)分值:在跳跃,节点按照各自所保存的分值从小到大排列。 4)成员对象:各个节点的o1、o2等是节点所保存的成员对象。...: 仅靠多个跳跃节点就可以组成一个跳跃 但通过使用一个zskiplist结构来持有这些节点,程序可以更加方便地对整个跳跃进行处理,比如快速访问跳跃表头节点节点,或者快速获取跳跃节点的数量...typedef struct zskiplist { //表头节点节点 struct zskiplistNode *header, *tail; //节点的的数量 unsigned long...length; //中层数最大的节点层数 int level; } zskiplist; headertail指针分别指向跳跃表头节点,通过这两个指针,程序定位表头节点的复杂度为

38030

链表第一课

此外,我们还需要两个变量,分别指向链表的头节点节点:本文使用first变量指向头节点,last变量指向节点。 下面介绍四个链表的操作: 创建第一个节点。 在表头添加节点。 在添加节点。...在表头删除节点。 创建第一个节点 创建第一个节点非常容易,只需要新建一个节点,并将变量firstlast都指向这个节点即可: ?...它还是第一个节点,所以lastfirst变量都指向它。 这个节点的item变量被赋值为boy,这是我们希望存储的数据。...在添加节点 在添加节点和在表头添加节点非常相似,过程如下: 将oldlast变量指向节点; 新建一个节点并将last变量指向他; 将oldlast变量所指节点的next变量指向新节点。 ?...链表一个典型的应用是在栈(LIFO)队列(FIFO),栈使用后进先出的策略,在表头添加节点,在表头删除节点;队列使用先进先出的策略,在表头添加节点,在删除节点。

30230

Redis02-Redis的数据结构之Redis链表

在这里插入图片描述 循环链表 循环链表与单链表双链表的不同之处是其呈环状。单循环链表节点并非指向NULL而是指向头节点。双循环链表其头节点的前驱指针指向节点。节点的后继指针指向头节点。...; tail记录了指针 len记录了链表长度,是链表长度计数器 dup、freematch成员则是用于实现多态链表所需的类型特定函数; dup函数用于复制表节点所保存的值 free函数用于释放链表节点所保存的值...无环:链表为非循环链表表头节点前驱指针的后继指针指向NULL,对链表的访问以NULL为终点。...带表头指针指针:通过list结构的headtail指针,获取表头节点的时间复杂度都是O(1)。...双端无环链表在Redis的使用 链表在Redis的应用非常广泛,列表对象的底层实现之一就是链表,此外发布订阅、慢查询、监视器等功能也用到了链表,我们现在简单想一想为什么使用双端无环链表,而不是数组

41130

怒肝 JavaScript 数据结构 — 双向链表篇

如果是空链表,那么将 head tail 属性赋值为新元素即可。因为新元素既是表头也是。...如果链表不为空,则说明表头已存在,我们要新元素的 next 赋值为表头,再将表头的 prev 赋值为新元素,最后再将新元素设置为新的表头即可。 末尾添加 末尾添加主要改变的是 tail 属性。...首先要将的 next 赋值为新元素,然后将新元素的 prev 再指向,最后将新元素赋值为新的。 中间位置添加 中间位置添加是指,插入的位置不是第一个,也不是最后一个。...这种情况下意味着表头都不需要动,只要将新元素与前后元素关联即可。 首先,获取索引位置的前一个元素 previous;然后再拿到索引位置的元素 current,也就是 previous.next。...将设置为当前元素 current,然后将向前挪动一位,并且将新的 next 设置为 undefined 即可。 中间位置删除 中间位置删除不需要考虑表头的情况。

29820

Redis的跳跃确定不了解下吗?

Redis跳跃图解 下图简单来说是对跳跃的改进再封装,首先引入了表头的概念,这与双向链表,字典结构一样,都是对数据的封装,因为他们都是采用的指针,而指针必然导致在计算长度,获取最后节点的数据问题上会产生查询太慢的性能问题...header:指向跳跃表头节点,通过这个指针地址可以直接找到表头,时间复杂度为O(1)。 tail:指向跳跃节点,通过这个指针可以直接找到,时间复杂度为O(1)。...后退指针backward:用于从表头遍历,每个节点只有一个后退指针,即每次只能后退一步。...创建跳跃 创建空的跳跃,其实就是创建表头管理所有的节点的level数组。首先,定义一些变量,尝试分配内存空间。其次是初始化表头的levellength,分别赋值10。...先从跳跃是什么,引出跳跃的概念和数据结构,剖析了其主要组成部分,进而通过多幅过程图解释了Redis是如何设计跳跃的,最后结合源码对跳跃进行描述,创建过程,添加节点过程,获取某个节点排名过程,中间穿插例子过程图

58720

《闲扯Redis十一》Redis 有序集合对象底层实现

ZRANGE 从表头遍历压缩列表, 返回给定索引范围内的所有元素。 从表头遍历跳跃, 返回给定索引范围内的所有元素。...ZREVRANGE 从表头遍历压缩列表, 返回给定索引范围内的所有元素。 从表头遍历跳跃, 返回给定索引范围内的所有元素。...从表头遍历跳跃, 查找给定的成员, 沿途记录经过节点的数量, 当找到给定成员之后, 途经节点的数量就是该成员所对应元素的排名。...从表头遍历跳跃, 查找给定的成员, 沿途记录经过节点的数量, 当找到给定成员之后, 途经节点的数量就是该成员所对应元素的排名。...注意:   为了展示方便, 图 8-17 在字典跳跃重复展示了各个元素的成员分值, 但在实际, 字典跳跃会共享元素的成员分值, 所以并不会造成任何数据重复, 也不会因此而浪费任何内存。

76430

跳跃确定不了解下😏

header:指向跳跃表头节点,通过这个指针地址可以直接找到表头,时间复杂度为O(1)。 tail:指向跳跃节点,通过这个指针可以直接找到,时间复杂度为O(1)。...后退指针backward:用于从表头遍历,每个节点只有一个后退指针,即每次只能后退一步。...跳跃的定义 表头结构zskiplist typedef struct zskiplist { //表头的头指针header指针tail struct zskiplistNode...创建跳跃 创建空的跳跃,其实就是创建表头管理所有的节点的level数组。首先,定义一些变量,尝试分配内存空间。其次是初始化表头的levellength,分别赋值10。...先从跳跃是什么,引出跳跃的概念和数据结构,剖析了其主要组成部分,进而通过多幅过程图解释了Redis是如何设计跳跃的,最后结合源码对跳跃进行描述,创建过程,添加节点过程,获取某个节点排名过程,中间穿插例子过程图

60320
领券