整体上代表封装的概念,重点是函数的封装,及函数运行的上下文环境。
trait Functor[F[_]]
Functor:代表整体封装;
F[_]:代表封装后的目标域。
A、B:代表普通的对象;
f:代表对象间转换的函数。
Functor[F[_]] :映射的结果和源在同一个范畴内;
 

Functor的代码表示

trait Functor[F[_]] {
 def map[A, B](a: F[A])(f: A => B): F[B]
} //list Functor的实现
def listFunctor = new Functor[List] {
 def map[A, B](a: List[A])(f: (A) => B) = a.map(f)
}

接下来我们用Scala实现Monad的定义:

trait Monad[M[_]] {
 def unit[A](a: A): M[A]   //identity
 def join[A](mma: M[M[A]]): M[A]
}

还有一种更为常见的定义方式,在Scala中Monad也是以这种方式出现:

trait Monad[M[_]] {
 def unit[A](a: A): M[A]
 def flatMap[A, B](fa: M[A])(f: A => M[B]): M[B]
}

要满足这两点,我们需要一个类型构造器

trait Functor[F[_]] {

    def typeMap[A]: F[A]

    def funcMap[A,B](f: A=>B): F[A]=>F[B]
}

我们现在可以把这个定义再简化一些,类型的映射方法可以不用,并把它作为一个type class

trait Functor[F[_]] {
def map[A,B](fa: F[A], f: A=>B): F[B]
}
 

最新文章

  1. vue.js开发环境搭建
  2. Nginx - Linux下按天分割日志
  3. OKhttp基本使用介绍
  4. 'libxml/tree.h' file not found
  5. angular+selecte2(angular ng-repeat渲染)
  6. Linux下编译OpenSSL
  7. js window.open 参数设置
  8. Retina 显示屏
  9. jquery treeTable插件使用细则
  10. ios初体验< 运用属性传值,登录>
  11. Ubuntu 16安装GPU版本tensorflow
  12. ASP.NET Core的身份认证框架IdentityServer4(5)- 包和构建
  13. JustMock .NET单元测试利器(二)JustMock基础
  14. vs2010 sp1 安装Silverlight5 语言版本不匹配的问题
  15. 抓包工具Charles基本用法
  16. 最新版本elasticsearch本地搭建入门篇
  17. mysql 案例~mysql主从复制延迟处理(2)
  18. react输入 撤销
  19. springboot之session、cookie
  20. 使用Windows Server 2003搭建一个asp+access网站

热门文章

  1. vue keep-alive保存路由状态1 (接下篇)
  2. android全屏去掉title栏的多种实现方法
  3. c#学习0217
  4. js产生随机数的几个方法
  5. Swift 4.0:访问级别(访问控制)
  6. 给DOM操作生成的元素添加事件
  7. [细节版]Let'sEncrypt 免费通配符/泛域名SSL证书添加使用教程
  8. JQ 添加节点和插入节点的方法总结
  9. mysql 修改默认的引擎
  10. yum下载的rpm包离线安装