热爱函数式的你,句句纯正的 Haskell【库函数篇】

简介: 本篇是笔记篇,介绍 Haskell 的强大的库函数,也可感受下与我们平常的 js 操作异同之处:

image.png

本篇是笔记篇,介绍 Haskell 的强大的库函数,也可感受下与我们平常的 js 操作异同之处:


id


给定一个任何的值,都返回这个给定的值;


Prelude> id "myId"
"myId"
Prelude> :t id
id :: a -> a


const


给定两个元素,只返回第一个;


Prelude> const 3 4
3
Prelude> :t const
const :: a -> b -> a


flip


将返回翻转;


Prelude> flip const 3 4
4
Prelude> :t flip
flip :: (a -> b -> c) -> b -> a -> c


error


抛一个异常;


Prelude> error "something error"
*** Exception: something error
Prelude> :t error
error :: [Char] -> a


undefined


暂时定义没有实现的函数,不让编译器报错;

Prelude> ac = undefined
Prelude> bc = ac+1
Prelude> :t undefined
undefined :: a


min/max


比较大小;

Prelude> min 5 6
5


!!


取列表中第 n+1 个数;

Prelude> [1,2,3] !!2
3


reverse


将列表元素倒叙;

Prelude> reverse[1,2,3]
[3,2,1]


head/last


取列表第一个元素或最后一个元素;

Prelude> head "Hello"
'H'
Prelude> last "Hello"
'o'


init/tail


将列表最后一个元素或第一个元素去掉;

Prelude> init [1..10]
[1,2,3,4,5,6,7,8,9]
Prelude> tail [1..10]
[2,3,4,5,6,7,8,9,10]


map


映射,得到一个新的列表;

Prelude> map (+1) [1,2,3,4]
[2,3,4,5]


还可以借助 λ匿名函数实现更复杂的映射:


Prelude> map (\x->x^2+1)[1,2,3,4]
[2,5,10,17]


filter


过滤函数;

Prelude> filter (>=7) [9,6,4,2,10,3,15]
[9,10,15]


由过滤函数衍生的两个判断奇数(odd)偶数(even)的函数:

Prelude> odd 4
False
Prelude> even 4
True


take/drop


take 函数可以从头连续地取得一个列表的几个元素;

Prelude> take 3 [1,2,3,4,5]
[1,2,3]


drop 与 take 相反,将列表中的前几个元素舍弃;

Prelude> drop 3 [1,2,3,4,5]
[4,5]


span/break


span 函数可以根据一个条件,从左至右,当遇到第一个不符合条件的元素时停止,将一个列表分成由两个列表组成的元组;

Prelude> span odd [1,3,5,6,9]
([1,3,5],[6,9])


break 函数则与 span 函数相反,它会根据一个条件,从左至右,当遇到符合条件的时候停止;


Prelude> break odd [1,3,5,6,9]
([],[1,3,5,6,9])


takeWhile/dropWhile


之前的 take 和 drop 函数是通过给定一个整数来取得或者去掉列表中的前几个元素,而 takeWhile 和 dropWhile 则需要一个条件来判断,条件不成立的时候停止取出或者去除;

Prelude> takeWhile (>5) [6,7,8,2,3,4]
[6,7,8]
Prelude> dropWhile (>5) [6,7,8,2,3,4]
[2,3,4]


splitAt


这个函数可以将一个列表在任何的位置分开;

Prelude> splitAt 5 "HelloWorld!"
("Hello","World!")


repeat/replicate


重复函数repeat可以将一个元素在列表里重复无数次;

replicate 是复制函数,可以将一个元素复制给定的次数;

Prelude> repeat True
[True,True,True,True,......
Prelude> replicate 5 True
[True,True,True,True,True]


实际上,我们可以用 take 和 repeat 函数实现 replicate 函数:


Prelude> replicate1 n a = take n (repeat a)
Prelude> replicate1 5 False
[False,False,False,False,False]


any/all


查询一个列表中是否存在符合给定条件的元素;

Prelude> any even [1,3,5]
False
Prelude> all odd [1,3,5]
True


and/or


and 会把一个列表中所有的布尔值用 && 连接起来;

or 则会把所有布尔值用 || 连接起来;

Prelude> and [True,True,False]
False
Prelude> or [True,True,False]
True


elem/notElem


elem 函数可以判断一个列表中是否存在某一元素;

Prelude> elem 1 [4,5,1]
True


notElem 是 elem 的否定;

Prelude> notElem 1 [4,5,1]
False


iterate


迭代函数;

Prelude> iterate (*2) 1
[1,2,4,8,16,32,64,128,256,512,1024,2048......


until


函数 until 可以迭代地来生成数据直到满足给定的条件为止;

Prelude> until(>500)(*2)1
512


zip


zip函数可以将两个列表结合成一个元组的列表;

Prelude> zip [True,False,True,False] [2,4,5,6,7]
[(True,2),(False,4),(True,5),(False,6)]


unzip


unzip 与 zip 逆向,是把一个二元元素列表分成两个列表元素的函数;


Prelude> unzip [(True,2),(False,4),(True,5),(False,6)]
([True,False,True,False],[2,4,5,6])


concat


concat 函数可以将一个列表中的列表相连;

Prelude> concat [[1,2],[3,4]]
[1,2,3,4]


concatMap


map 函数将 [a] 计算为 [[b]] 类型的结果,再使用 concat 函数来得到类型为 [b] 的结果;

Prelude> map (replicate 3) [1,2,3]
[[1,1,1],[2,2,2],[3,3,3]]



相关文章
|
安全 前端开发 Java
Spring Security系列教程25--解决Spring Security环境中的跨域问题
前言 上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题。 一. 启用Spring Security 的CORS支持 1. 创建web接口 我先在SpringBoot环境中,创建一个端口号为8080的web项目,注意这个web项目没有引入Spring Security的依赖包。然后在其中创建一个IndexController,定义两个测试接口以便被ajax进行跨域访问。 @RestController public class IndexController {
1748 1
|
3月前
|
弹性计算 运维 负载均衡
阿里云渠道商:阿里云弹性公网IP是什么?
阿里云弹性公网IP(EIP)实现IP与计算资源解耦,支持灵活绑定、动态切换,提升业务稳定性和网络灵活性,广泛应用于高可用架构、成本优化及跨境访问场景。
|
7月前
|
运维 Prometheus 监控
系统崩了怪运维?别闹了,你该问问有没有自动化!
系统崩了怪运维?别闹了,你该问问有没有自动化!
227 9
|
设计模式 Java Linux
Linux的20个常用命令
Linux的23个常用命令
Linux的20个常用命令
|
11月前
|
存储 固态存储 NoSQL
阿里云服务器ESSD AutoPL、高效云盘、ESSD云盘、SSD云盘区别与选型参考
阿里云系统盘与数据盘如何选择?目前阿里云服务器的云盘主要有ESSD AutoPL、高效云盘、ESSD云盘、SSD云盘可供选择,很多新手用户并不清楚他们之间的区别,也就不知道应该如何选择,因为不同的云盘在最大IOPS、最大吞吐量等性能上是有区别的。本文基于阿里云官方技术文档,结合实际应用案例,对ESSD AutoPL、ESSD PL-X、SSD云盘等主要云盘的区别做个介绍,以供参考,助您构建高性能、高可靠、高扩展的存储架构。
|
JSON 资源调度 前端开发
axios中的那些代码!
Axios为HTTP请求提供了一个强大的工具集,使得前端开发中与服务器通信变得更加简单和高效。通过掌握Axios的基础用法、拦截器、取消请求以及处理并发请求等高级功能,开发者可以大大提升开发效率和代码质量。希望本文能够帮助你更好地理解和使用Axios。
266 14
|
存储 算法 Java
【DFS(深度优先搜索)详解】看这一篇就够啦
本文介绍了深度优先搜索(DFS)算法及其应用。DFS从某个顶点出发,深入探索图的每条路径,直到无法前进为止,然后回溯。文章详细解释了DFS的基本思想,并通过示例图展示了其执行过程。此外,文中还探讨了三种枚举方式:指数型枚举、排列型枚举和组合型枚举,并提供了具体的代码实现。最后,文章通过几道练习题帮助读者更好地理解和应用DFS算法。
10732 19
【DFS(深度优先搜索)详解】看这一篇就够啦
|
运维 监控 关系型数据库
PostgreSQL运维核心技能之掌握并行查询
PostgreSQL运维核心技能之掌握并行查询
434 9
|
编解码 vr&ar 开发工具
VR头显如何低延迟播放8K的RTSP|RTMP流
本文探讨了在Unity平台上实现VR头显播放8K RTSP/RTMP直播流的技术方案。需确保播放器兼容8K并具高效解码能力,利用GPU加速;网络须稳定且带宽充足;VR头显如Quest 3需拥有高性能处理器与内存。文中以大牛直播SDK为例,详细介绍了播放流程及参数设置,最终实现在Quest 3上毫秒级延迟的8K视频播放,适用于高实时性需求的应用场景。
551 1