zoukankan      html  css  js  c++  java
  • Functor& Monad解读

    整体上代表封装的概念,重点是函数的封装,及函数运行的上下文环境。
    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]
    }
    
     
  • 相关阅读:
    web单机优化
    html标签
    html基础
    jenkins api
    cobbler api
    Cobbler安装配置简单使用
    ubuntu 12.04下搭建web服务器(MySQL+PHP+Apache) 教程
    在ubuntu12.04上安装6款顶级漂亮的BURG主题
    Setting up an OpenGL development environment in ubuntu
    c++ list 容器
  • 原文地址:https://www.cnblogs.com/feng9exe/p/8656389.html
Copyright © 2011-2022 走看看