首先,我们来看一下 Functor typeclass 的定义:

1

2

class Functor f where

fmap :: (a -> b) -> f a -> f b

Functor typeclass fmap (a -> b) f a f b f Functor :fmap 函数可类比 Swift 中的 map 方法。

Applicative typeclass

同样的,我们先来看一下 Applicative typeclass 的定义:

1

2

3

class Functor f => Applicative f where

pure :: a -> f a

(<*>) :: f (a -> b) -> f a -> f b

我们注意到,与 Functor typeclass 的定义不同的是,在 Applicative typeclass 的定义中多了一个类约束 Functor f ,表示的意思是数据类型 f 要实现 Applicative typeclass 的前提条件是它必须要实现 Functor typeclass ,也就是说它必须是一个 Functor 。

在 Applicative typeclass 中定义了两个函数:

  • pure a (<*>) :将一个在上下文中的函数 f (a -> b) 应用到一个在上下文中的值 f a ,并返回另一个在上下文中的值 f b 。

同样的,我们先来看一下 Monad typeclass 的定义:

1

2

3

4

5

6

7

8

9

10

class Applicative m => Monad m where

return :: a -> m a

(>>=) :: m a -> (a -> m b) -> m b

(>>) :: m a -> m b -> m b

x >> y = x >>= \_ -> y

fail :: String -> m a

fail msg = error msg

Monad typeclass return(>>=)(>>) fail (>>) fail Monad typeclass

1

2

3

class Applicative m => Monad m where

return :: a -> m a

(>>=) :: m a -> (a -> m b) -> m b

怎么样?现在看上去就好多了吧。跟 Applicative typeclass 的定义一样,在 Monad typeclass 的定义中也有一个类约束 Applicative m ,表示的意思是一种数据类型 m 要成为 Monad 的前提条件是它必须是 Applicative 。另外,其实 return 函数的功能与 Applicative 中的 pure 函数的功能是一样的,只不过换了一个名字而已,它们的作用都是将一个值 a 放入上下文中。而 (>>=) 函数的功能则是应用一个(接收一个普通值 a 但是返回一个在上下文中的值 m b 的)函数 (a -> m b) 到一个上下文中的值 m a ,并返回另一个在相同上下文中的值 m b 。

最新文章

  1. Subsets II
  2. 用户故事驱动的敏捷开发 – 2. 创建backlog
  3. 【博客美化】06.添加QQ交谈链接
  4. Innodb 表空间卸载、迁移、装载
  5. Oracle查询索引碎片及数据表空间使用情况
  6. [转] VB之Val()函数的使用
  7. java封装对象转json字符串
  8. jsp页面转发到servlet
  9. C# 实现文件夹的复制以及删除
  10. iBeacon在iPhone锁屏下有几率扫描不到蓝牙设备以及折中解决方案
  11. LINUX安装vm tools及使用方法(centos7,vm12)
  12. C#中Key事件
  13. PowerBI开发 第三篇:报表设计技巧
  14. cogs 362. [CEOI2004]锯木厂选址
  15. UVA-10615 Rooks (二分图匹配)
  16. AtCoder Regular Contest 074 瞎打记
  17. Python:PyCharm如何导入模块
  18. Drupal显示白屏或500?
  19. POJ-2886 Who Gets the Most Candies?---线段树+约瑟夫环
  20. 【luogu P2169 正则表达式】 题解

热门文章

  1. 聚合类新闻client初体验
  2. android锁屏软件制作
  3. CentOS 7.2更改网卡名称
  4. YTU 2416: C语言习题 成绩输出
  5. 配置JDK环境变量配置及path和classpath的作用
  6. P4455 [CQOI2018]社交网络
  7. 【转】浏览器中输入url后发生了什么
  8. bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】
  9. bzoj 1444: [Jsoi2009]有趣的游戏【AC自动机+dp+高斯消元】
  10. bzoj 4784: [Zjoi2017]仙人掌【tarjan+树形dp】