Functor、Applicative 和 Monad x
首先,我们来看一下 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 。
最新文章
- Subsets II
- 用户故事驱动的敏捷开发 – 2. 创建backlog
- 【博客美化】06.添加QQ交谈链接
- Innodb 表空间卸载、迁移、装载
- Oracle查询索引碎片及数据表空间使用情况
- [转] VB之Val()函数的使用
- java封装对象转json字符串
- jsp页面转发到servlet
- C# 实现文件夹的复制以及删除
- iBeacon在iPhone锁屏下有几率扫描不到蓝牙设备以及折中解决方案
- LINUX安装vm tools及使用方法(centos7,vm12)
- C#中Key事件
- PowerBI开发 第三篇:报表设计技巧
- cogs 362. [CEOI2004]锯木厂选址
- UVA-10615 Rooks (二分图匹配)
- AtCoder Regular Contest 074 瞎打记
- Python:PyCharm如何导入模块
- Drupal显示白屏或500?
- POJ-2886 Who Gets the Most Candies?---线段树+约瑟夫环
- 【luogu P2169 正则表达式】 题解
热门文章
- 聚合类新闻client初体验
- android锁屏软件制作
- CentOS 7.2更改网卡名称
- YTU 2416: C语言习题 成绩输出
- 配置JDK环境变量配置及path和classpath的作用
- P4455 [CQOI2018]社交网络
- 【转】浏览器中输入url后发生了什么
- bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】
- bzoj 1444: [Jsoi2009]有趣的游戏【AC自动机+dp+高斯消元】
- bzoj 4784: [Zjoi2017]仙人掌【tarjan+树形dp】