Data.Tuple

fst                     :: (a,b) -> a
fst (x,_) = x snd :: (a,b) -> b
snd (_,y) = y curry :: ((a, b) -> c) -> a -> b -> c
curry f x y = f (x, y) uncurry :: (a -> b -> c) -> ((a, b) -> c)
uncurry f p = f (fst p) (snd p) swap :: (a,b) -> (b,a)
swap (a,b) = (b,a)

Data.Tuple 模块提供了针对元组的五个函数。

  • fst 取二元组的第一个成员。
  • snd 取二元组的第二个成员。
  • swap 交换二元组的两个成员。
  • curry :: ((a, b) -> c) -> a -> b -> c

    curry 柯里化,将原来接收二元组的函数改为接收两个参数的柯里化函数。

    curry ((x,y) -> x+y) = (\x y -> x+y)
  • uncurry :: (a -> b -> c) -> ((a, b) -> c)

    uncurry 去柯里化,将原来接收两个参数的柯里化函数改为接收二元组的函数。

    uncurry (\x y -> x+y) = ((x,y) -> x+y)
Prelude> fst (1,2)
1
Prelude> snd (1,2)
2
Prelude Data.Tuple> curry (\(x,y) -> x+y) 3 4
7
Prelude Data.Tuple> uncurry (\x y -> x+y) (3,4)
7
Prelude> uncurry max (1,2)
2
Prelude> uncurry min (1,2)
1
Prelude Data.Tuple> swap (1,2)
(2,1)

Data.Tuple.All

安装 tuple 模块。

$ cabal install tuple
Installed tuple-0.3.0.2
Prelude> :m +Data.Tuple.All
Prelude Data.Tuple.All>

tuple 模块提供了对多达32个成员的元组的支持。

同时该模块还引进了单个成员的元组 OneTuple 类型。

  • selN 取出元组的第N个成员。
  • updN 修改元组的第N个成员。
  • curryN, uncurryN 是标准库中curry, uncurry函数针对N个成员的元组的版本。
  • sequenceT 是标准库中 sequence 的元组版本。
Prelude Data.Tuple.All> sel1 (1,2,3,4)
1
Prelude Data.Tuple.All> sel4 (1,2,3,4)
4
Prelude Data.Tuple.All> upd1 5 (1,2,3,4)
(5,2,3,4)
Prelude Data.Tuple.All> upd4 5 (1,2,3,4)
(1,2,3,5)
Prelude Data.Tuple.All> sel1 (OneTuple 1)
1
Prelude Data.Tuple.All> upd1 5 (OneTuple 1)
OneTuple 5
Prelude Data.Tuple.All> curryN (\(x,y,z) -> x+y+z) 3 4 5
12
Prelude Data.Tuple.All> uncurryN (\x y z -> x+y+z) (3,4,5)
12
Prelude Data.Tuple.All> sequenceT (print 3, print 4)
3
4
((),())

Data.Tuple.Extra

安装 extra 模块。

$ cabal install extra
Installed extra-1.6
Prelude> :m +Data.Tuple.Extra
Prelude Data.Tuple.Extra>
Prelude Data.Tuple.Extra> first succ (1,"test")
(2,"test")
Prelude Data.Tuple.Extra> second reverse (1,"test")
(1,"tset")
Prelude Data.Tuple.Extra> (succ *** reverse) (1,"test")
(2,"tset")
Prelude Data.Tuple.Extra> (succ &&& pred) 1
(2,0)
Prelude Data.Tuple.Extra> dupe 12
(12,12)
Prelude Data.Tuple.Extra> both succ (1,2)
(2,3)
Prelude Data.Tuple.Extra> let a = (1,2,3)
Prelude Data.Tuple.Extra> print $ (fst3 a) + (snd3 a) + (thd3 a)
6

Haskell语言学习笔记(48)Data.Tuple的更多相关文章

  1. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  2. Haskell语言学习笔记(44)Lens(2)

    自定义 Lens 和 Isos -- Some of the examples in this chapter require a few GHC extensions: -- TemplateHas ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  5. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  6. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  7. Haskell语言学习笔记(28)Data.Map

    Map Prelude> import Data.Map as Map Prelude Map> :set -XOverloadedLists Prelude Map> Overlo ...

  8. Haskell语言学习笔记(93)Data.Text

    Data.Text.Read Prelude> :set -XOverloadedStrings Prelude> :m +Data.Text.Read Prelude Data.Text ...

  9. Haskell语言学习笔记(81)Data.Typeable

    Data.Typeable 利用 Data.Typeable,可以打印动态类型信息. class Typeable (a :: k) where typeRep# :: TypeRep a typeR ...

随机推荐

  1. spring答题

    ioc 依赖注入:通过注入的方式实例化对象,不再直接new对象了,交给spring容器进行管理和维护 控制反转:实例化对象的控制权交给了spring容器,而不再是某个单独的类,控制权发生了变更 作用: ...

  2. php取两个整数的最大公约数算法大全

    php计算两个整数的最大公约数常用算法 <?php//计时,返回秒function microtime_float (){ list( $usec , $sec ) = explode ( &q ...

  3. Nginx 整合 FastDFS 实现文件服务器

    原文地址:Nginx 整合 FastDFS 实现文件服务器 博客地址:http://www.extlight.com 一.前言 本篇衔接<FastDFS 环境搭建>内容进行讲解,上篇文章我 ...

  4. HDU 1116 Play on Words(并查集和欧拉回路)(有向图的欧拉回路)

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  5. js关于a++ 与++a

    var a=6; var b=a++; 此时a的值是7;a++的值是7;b的值是6; var c=8; var d=--c; 此时c的值是7;--c的值是6;d的值是7;

  6. WDA编译失败问题

    1.放假回来,wda编译失败,报错如下 2018-09-25 10:03:09.020964+0800 WebDriverAgentRunner-Runner[335:33309] +[CATrans ...

  7. 在Linux 系统 Latex安装 使用入门教程

    来源: http://blog.chinaunix.net/u/25605/showart_2100398.html 入门介绍好文:TeX.LaTeX.TeXLive 小结 笔记详情:http://v ...

  8. linux shell 命令常用快捷键

    下面是一些shell的常用快捷键,快捷键玩熟悉了在一定程度上是可以提高工作效率滴… Ctrl + a 切换到命令行开始 Ctrl + e 切换到命令行末尾 Ctrl + l 清除屏幕内容 Ctrl + ...

  9. mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)

    当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12',' ...

  10. SQL语句嵌套if

    在存储过程中我要实现一个IF的嵌套语句查询,类似与 if() {     if()      {         ......      }      else      {         .... ...