前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >热爱函数式的你,句句纯正的 Haskell【库函数篇】

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

作者头像
掘金安东尼
发布2022-09-19 11:10:11
4400
发布2022-09-19 11:10:11
举报
文章被收录于专栏:掘金安东尼

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

id

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

代码语言:javascript
复制
Prelude> id "myId"
"myId"

Prelude> :t id
id :: a -> a

const

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

代码语言:javascript
复制
Prelude> const 3 4
3

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

flip

将返回翻转;

代码语言:javascript
复制
Prelude> flip const 3 4
4

Prelude> :t flip
flip :: (a -> b -> c) -> b -> a -> c

error

抛一个异常;

代码语言:javascript
复制
Prelude> error "something error"
*** Exception: something error

Prelude> :t error
error :: [Char] -> a

undefined

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

代码语言:javascript
复制
Prelude> ac = undefined
Prelude> bc = ac+1

Prelude> :t undefined
undefined :: a

min/max

比较大小;

代码语言:javascript
复制
Prelude> min 5 6
5

!!

取列表中第 n+1 个数;

代码语言:javascript
复制
Prelude> [1,2,3] !!2
3

reverse

将列表元素倒叙;

代码语言:javascript
复制
Prelude> reverse[1,2,3]
[3,2,1]

head/last

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

代码语言:javascript
复制
Prelude> head "Hello"
'H'
Prelude> last "Hello"
'o'

init/tail

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
Prelude> map (+1) [1,2,3,4]
[2,3,4,5]

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

代码语言:javascript
复制
Prelude> map (\x->x^2+1)[1,2,3,4]
[2,5,10,17]

filter

过滤函数;

代码语言:javascript
复制
Prelude> filter (>=7) [9,6,4,2,10,3,15]
[9,10,15]

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

代码语言:javascript
复制
Prelude> odd 4
False

Prelude> even 4
True

take/drop

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

代码语言:javascript
复制
Prelude> take 3 [1,2,3,4,5]
[1,2,3]

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

代码语言:javascript
复制
Prelude> drop 3 [1,2,3,4,5]
[4,5]

span/break

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

代码语言:javascript
复制
Prelude> span odd [1,3,5,6,9]
([1,3,5],[6,9])

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

代码语言:javascript
复制
Prelude> break odd [1,3,5,6,9]
([],[1,3,5,6,9])

takeWhile/dropWhile

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
Prelude> splitAt 5 "HelloWorld!"
("Hello","World!")

repeat/replicate

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

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

代码语言:javascript
复制
Prelude> repeat True
[True,True,True,True,......

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

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

代码语言:javascript
复制
Prelude> replicate1 n a = take n (repeat a)
Prelude> replicate1 5 False
[False,False,False,False,False]

any/all

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

代码语言:javascript
复制
Prelude> any even [1,3,5]
False

Prelude> all odd [1,3,5]
True

and/or

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

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

代码语言:javascript
复制
Prelude> and [True,True,False]
False

Prelude> or [True,True,False]
True

elem/notElem

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

代码语言:javascript
复制
Prelude> elem 1 [4,5,1]
True

notElem 是 elem 的否定;

代码语言:javascript
复制
Prelude> notElem 1 [4,5,1]
False

iterate

迭代函数;

代码语言:javascript
复制
Prelude> iterate (*2) 1
[1,2,4,8,16,32,64,128,256,512,1024,2048......

until

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

代码语言:javascript
复制
Prelude> until(>500)(*2)1
512

zip

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

代码语言:javascript
复制
Prelude> zip [True,False,True,False] [2,4,5,6,7]
[(True,2),(False,4),(True,5),(False,6)]

unzip

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

代码语言:javascript
复制
Prelude> unzip [(True,2),(False,4),(True,5),(False,6)]
([True,False,True,False],[2,4,5,6])

concat

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

代码语言:javascript
复制
Prelude> concat [[1,2],[3,4]]
[1,2,3,4]

concatMap

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

代码语言:javascript
复制
Prelude> map (replicate 3) [1,2,3]
[[1,1,1],[2,2,2],[3,3,3]]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • id
  • const
  • flip
  • error
  • undefined
  • min/max
  • !!
  • reverse
  • head/last
  • init/tail
  • map
  • filter
  • take/drop
  • span/break
  • takeWhile/dropWhile
  • splitAt
  • repeat/replicate
  • any/all
  • and/or
  • elem/notElem
  • iterate
  • until
  • zip
  • unzip
  • concat
  • concatMap
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档