Bitraversable

  1. class (Bifunctor t, Bifoldable t) => Bitraversable t where
  2. bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)
  3. bitraverse f g = bisequenceA . bimap f g
  4. bisequenceA :: (Bitraversable t, Applicative f) => t (f a) (f b) -> f (t a b)
  5. bisequenceA = bitraverse id id

Bitraversable 是个类型类。主要用于遍历二元数据结构。

Either 是个 Bitraversable

  1. instance Bitraversable Either where
  2. bitraverse f _ (Left a) = Left <$> f a
  3. bitraverse _ g (Right b) = Right <$> g b

(,) 是个 Bitraversable

  1. instance Bitraversable (,) where
  2. bitraverse f g ~(a, b) = (,) <$> f a <*> g b

Const 是个 Bitraversable

  1. instance Bitraversable Const where
  2. bitraverse f _ (Const a) = Const <$> f a

应用 Bitraversable

  1. Prelude Data.Bitraversable> bitraverse (\x -> [x, x+1]) (\x -> [x, x*2]) (Left 2)
  2. [Left 2,Left 3]
  3. Prelude Data.Bitraversable> bitraverse (\x -> [x, x+1]) (\x -> [x, x*2]) (Right 3)
  4. [Right 3,Right 6]
  5. Prelude Data.Bitraversable> bitraverse (\x -> [x, x+1]) (\x -> [x, x*2]) (2,3)
  6. [(2,3),(2,6),(3,3),(3,6)]
  7. Prelude Data.Bitraversable Control.Applicative> bitraverse (\x -> [x, x+1]) (\x -> [x, x*2]) (Const 2)
  8. [Const 2,Const 3]
  9. Prelude Data.Bitraversable> bisequenceA (Left [2,3])
  10. [Left 2,Left 3]
  11. Prelude Data.Bitraversable> bisequenceA (Right [2,3])
  12. [Right 2,Right 3]
  13. Prelude Data.Bitraversable> bisequenceA ([2,3],[4,5])
  14. [(2,4),(2,5),(3,4),(3,5)]
  15. Prelude Data.Bitraversable Control.Applicative> bisequenceA (Const [2,3])
  16. [Const 2,Const 3]

Haskell语言学习笔记(59)Bitraversable的更多相关文章

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

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

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

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

  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语言学习笔记(39)Category

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

  6. Haskell语言学习笔记(72)Free Monad

    安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...

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

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

  8. Haskell语言学习笔记(38)Lens(1)

    Lens Lens是一个接近语言级别的库,使用它可以方便的读取,设置,修改一个大的数据结构中某一部分的值. view, over, set Prelude> :m +Control.Lens P ...

  9. Haskell语言学习笔记(92)HXT

    HXT The Haskell XML Toolbox (hxt) 是一个解析 XML 的库. $ cabal install hxt Installed hxt-9.3.1.16 Prelude&g ...

随机推荐

  1. linux下编译GD(freetype+libjpeg+libpng+gd-devel)

    linux下编译GD(freetype+libjpeg+libpng+gd-devel) 1.检查freetype是否安装rpm -qa | grep freetype没有的话编译freetype 这 ...

  2. json包含单双引号问题解决方案

    解决方案:在后台处理 JSONArray.fromObject(list).toString() 转自明明如月小角落: 效果DEMO: JsonQuotesUtil.js /** * 解决json传输 ...

  3. GitHub + circleCI 自动构建/自动部署 应用

    GitHub + circleCI 自动构建/自动部署, 这里略过了单元测试,以部署 laravel 应用为例子 比起 gitlab + ansible + genkins 操作起来节省了很多硬件资源 ...

  4. yield对性能提升的一次小小测试

    生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低.生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中 ...

  5. myeclipse修改编译器版本的方法 .

    今天在导入一个工程时,发现出现java.lang.UnsupportedClassVersionError: Bad version number in .class file异常,检查了一下我的my ...

  6. sigar在Centos和Windows下使用java系统软硬件配置信息

    背景 本来这个网上一大堆实在没什么想写的,但是好像大多数都是互相抄袭的,在centos根本上用不了,因此我整理下自己具体实现的步骤. 使用环境 sigar版本:hyperic-sigar-1.6.4  ...

  7. 峰Spring4学习(2)依赖注入的几种方式

    一.装配一个bean 二.依赖注入的几种方式 com.cy.entity   People.java: package com.cy.entity; public class People { pri ...

  8. OpenGL 画出雷达动态扫描效果(一)

    最终效果如下所示 Demo下载  http://files.cnblogs.com/xd-jinjian/Debug.zip 源代码下载 http://download.csdn.net/detail ...

  9. 解决“Can't bind to local 8630 for debugger”错误--查杀多余进程

    Can't bind to local 8630 for debugger 表明本地8630端口被占用 1.Windows平台 在windows命令行窗口下执行: 1.查看所有的端口占用情况 C:\& ...

  10. SQL中去掉字符串中最后一个字符(小技巧)

    --长度减一就可以了 select left(字段名,len(字段名)-1) from 表名