首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Scalaz(25)- Monad: Monad Transformer-叠加Monad效果

    在它的for-comprehension里的运算结果类型是ReaderWriterState一种,所以没有stair-stepping忧虑。但我们必须先创建一个新的类型(不是通过函数组合的新类型)。...难道我们在使用不同要求的for-comprehension时都需要重新创建一个新类型吗,这样不就损失了FP的代码重复使用特点了吗?...而我们在操作时如在for-comprehension中运算时使用的类型则必须统一为OptionT[Either,A]。 我们如何去构建Monad Transformer类型值呢?...与重新构建另一个类型不同的是,通过Monad Transformer叠加Monad组合形成类型的操作依然使用各组成Monad的操作函数,这些函数运算结果类型任然是对应的Monad类型,所以需要一些升格函数...而重建类型则继承了组成Monad的操作函数,它们的运算结果类型都与新建的这个类型一致。下面我们还是用上面的这个Either+Option例子来示范。

    79460

    Scalaz(11)- Monad:你存在的意义

    突然之间我们的焦点好像都放在了如何获取typeclass实例上了,从而忽略了考虑为什么要使用这些typeclass及使用什么样的typeclass这些问题了。...所以可能有人会问我:如何获取Int的Monad实例。我会反问:傻B,你疯了吗(are you insane)?你到底想干什么?这时傻B可能忽然会醒悟还没真正了解自己这样问的目的。...比如Functor, Applicative, Monad都代表不同的编程方式或者说它们都具备不同的程序运算模式。特质是指不同的数据类型所定义的typeclass实例控制着程序的具体运算行为。...它们都因为基于不同类型的实例而表现不同的运算行为。Functor, Applicative, Monad的特质则由它们的实例中map, ap, flatMap这三个驱动函数的具体实现方式所决定。...我看多数可能是实现Monad实例,这样我们就可以在自定义类型的控制下进行Monadic编程了,即在for-comprehension内进行熟悉的行令编程(imperative programming)。

    89980

    泛函编程(28)-粗俗浅解:Functor, Applicative, Monad

    经过了一段时间的泛函编程讨论,始终没能实实在在的明确到底泛函编程有什么区别和特点;我是指在现实编程的情况下所谓的泛函编程到底如何特别。...既然变量封装在了套子里面,那么自然需要设计一些在套子里更新变量的函数了: 我们的目的是用某些函数把F[A]变成F[B]:A 变成了 B,但任然封装在 F[] 里: 下面我们列出几个函数,它们的操作结果都是一样的...但Functor,Applicative,Monad都是泛函数据类型,我们还没有明确定义这些数据类型。这些数据类型自提供了操作函数对嵌在内部的变量进行更新。也就是说它们应该自带操作函数。...现在我们可以创建Box实例: 1 val bxHello = Box("Hello") //> bxHello : ch12.ex4.Box[String...,bxHello是个Functor实例。

    1.1K60

    Scalaz(6)- typeclass:Functor-just map

    scalaz提供了Functor typeclass不但使用户能map over自定义的高阶类型F[T],并且用户通过提供自定义类型的Functor实例就可以免费使用scalaz Functor typeclass...针对我们自定义的类型,我们只要实现map函数就可以得到这个类型的Functor实例。一旦实现了这个类型的Functor实例,我们就可以使用以上scalaz提供的所有Functor组件函数了。...我们先试着创建一个类型然后推算它的Functor实例: 1 case class Item3[A](i1: A, i2: A, i3: A) 2 val item3Functor = new Functor...类型的Functor实例我们就能免费使用所有的注入方法: scalaz提供了Function1的Functor实例。...不过从运算结果来看,用这些函数来产生一些数据模型用在游戏或者测试的模拟(simulation)倒是可能的。 scalaz提供了许多现成的Functor实例。

    83450

    Functor与Applicative_Haskell笔记7

    Functor ((,) a) -- Defined in ‘GHC.Base’ (注意:简单起见,上面列出的只是一般Functor实例,去掉了3个同样属于Applicative的特殊Functor实例...首先Functor的fmap类型是: fmap :: Functor f => (a -> b) -> f a -> f b 既然((->) r)也是Functor实例,用((->) r)换掉f: fmap...因为Functor class要求: class Functor (f :: * -> *) where fmap :: (a -> b) -> f a -> f b f必须是接受一个具体类型参数的类型...这个语境可能是这个computation可能带有值,或是有可能会失败(像Maybe跟Either a),或是他可能有多个值(像lists),等等。...): applicative functor不只是有趣而且实用,它允许我们结合不同种类的计算,像是I/O计算,non-deterministic的计算,有可能失败的计算等等。

    59730

    泛函编程(32)-泛函IO:IO Monad

    我们现在可以创建一个F类型的实例然后运算IO: 1 trait Console[A] 2 case object ReadLine extends Console[Option[String]]...Monad实例,函数runM现在能运算IO类型的值了。...在以上的讨论过程中我们得出了这样的结论:F类型代表了IO类型的Interpreter,我们不需要知道它到底产生副作用与否或者怎样产生。我们用F类型来把副作用的使用推延到F类型的实例。...Free的功能由Monad和Interpreter两部分组成:Monad部分使我们可以使用Monadic编程语言来描述一些算法,Interpreter就是F类型,必须是个Functor,它负责描述副作用行为...这个过程可能会产生副作用。至于如何产生副作用,产生什么样的副作用则由Interpreter程序描述。

    2.5K70

    【C++修炼之路】30.可变参数模板&&包装器

    C++11的新特性可变参数模板能够创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。...那么func可能是函数名?函数指针?函数对象(仿函数对象)?也有可能是lamber表达式对象?所以这些都是可调用的类型!如此丰富的类型,可能会导致模板的效率低下! //为什么呢?...,如何证明?...count作为static类型,每一次的地址都不同,所以可以看出,实例化了三次。...为了防止这种方式造成的效率低下,使其只实例化一份,让这个地方统一一下,这就利用到了function: function包装器的作用: 对各种可调用对象进行类型统一 #include<functional

    33831

    泛函编程(23)-泛函数据类型-Monad

    其它类型的Functor实例: 1 object OptionFunctor extends Functor[Option] { 2 def map[A,B](oa: Option[A])...不过讲实在话,上面的这些实例都没什么意义,因为施用的具体类型本身就支持map。也就是说List,Option等本身就是Functor。换句话讲就是:它们都可以map,所以都是Functor。...这里的map还是抽象的,意味着还需要在具体的类型实例里实现。我们在设计unzip时是针对F的。...不过这种抽象的目的和模式可能跟Monad有什么关联吧?...不同的还是具体施用受体的数据类型。看来我们还是因为各种数据类型的不同而重复编写了map2组件。我们应该想办法一次实现map2后让所有数据类型实例都可以使用,从而彻底避免重复编码。

    84880

    Scalaz(27)- Inference & Unapply :类型的推导和匹配

    经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏重学术型了。...scala类型系统的主要功能就是在程序运行之前,在编译时(compile time)尽量捕捉代码中可能出现的错误,也就是类型不匹配错误。...一般来说我们都会在函数内部引用isthere这种隐式参数,并且按不同需要在隐式转换解析域内创建不同功能的类型实例(instance): 1 trait Proof { def apply(): String...我们先用他举的一个例子来看看如何利用依赖类型及类型实例通过隐式输入参数类型来推导结果类型并判断输入参数类型正确性的: 1 trait TypeA 2 trait TypeB 3 4 trait...TypeWithMap类型实例, F是个Functor。

    1.2K80

    Scalaz(40)- Free :versioned up,再回顾

    由于Free Monad可能是一种主流的FP编程规范,所以在进入实质编程之前必须把所有东西都搞清楚。前面遇到的问题主要与scalaz Free的FreeC类型有关系。...这个类型主要是针对一些非Functor的F[A]特别设计的。...因为我们通常都在Functor和非Functor ADT混合应用环境下,所以倾向于通用一些的类型和结构,特别是使用联合语句Coproduct时是不容许不同Free类型的。...实际上造成FreeC类型麻烦的根本是Free[S[_],A]类型其中一个实例case class Suspend[S[_],A](s: S[Free[S,A]]),这个实例必须用monad的join来运算...另一个原因可能是scalaz借鉴了haskell的实现方式。无论如何,为了解决我们遇到的问题,必须想办法绕过S必须是Functor这个门槛。

    1.3K100

    《The Joy of Javascript》- 2 - FunctorMonad

    原生的 Array 类型就是一个 Functor [1, 2, 3, 4].map(add).map(add) Functor 的设计原则 identity: 如果给 map 传递一个返回自己的方法...((x) => f(g(x))) === F.map(g).map(f) Functor 实例 一般会实现以下属性和方法: 1....要求输入和输出一致比如 number -> number 但是有一些操作会返回更多的类型比如 number -> number[] 这个时候需要一个 flatMap 方法进行拍平 又或者可能会出现返回嵌套类型比如...number -> { res: number } 这个时候可能需要对 Object 进行额外的 mapping Monad 就是通过一个额外的方法来将返回不一致的情况进行处理, 使其方便后期 compose...复合操作 Monad 的设计原则 注意 chain 方法根据不同的实现可能会有不同的名称 Left identity: M.of(a).chain(f) === f(a) Right identity

    29130

    最大限度地降低多线程 C# 代码的复杂性

    例如,可能要从共享对象中读取 10 个不同的线程,并且通过 System.Threading 命名空间中的 ReaderWriterLockSlim 类授权这些线程同时访问实例,而不导致问题发生。...通过将诸如此类的问题分散到两个不同的接口,并对基础类型实现这两个接口,可使用 Synchronizer 类来同步对实例的访问权限。...调试多线程代码通常极为困难,并且创建同步对象的单元测试可能会是徒劳无功之举。...不过,通过重新思考如何使用 C#,并深入了解它的各方面功能,解决一些问题就变得更加简单了。目前形式的 OOP 不太易于重用,原因很多是因为它是强类型。...如果我使用 OOP 规则创建了 Lizzie,我会认为,它在大小上可能至少大一个数量级。 当然,如今 OOP 和强类型处于主导地位,想要找到一个主要必需技能不要求它的职位描述,几乎是不可能的。

    18730

    什么是 Monad (Functional Programming)?函子到底是什么?ApplicativeMonad

    函数式编程的精髓就在于,我们可以用好多好多小小函数,搭搭搭,组成一个个大函数,最终写出整个程序来。...有一个特殊幺元,能够和任何元素组合,导致的结果是不改变这些元素。 函子到底是什么? 一个函子Functor是任意类型,这些类型定义了如何应用 map (fmap in Haskell) 。...也就是说,如果我们要将普通函数应用到一个有盒子上下文包裹的值,那么我们首先需要定义一个叫Functor的数据类型,在这个数据类型中需要定义如何使用map或fmap来应用这个普通函数。...我们已经知道自函数就是把类型映射到自身类型,那么自函子就是把范畴映射到自身范畴。 自函子是如何映射范畴的,见下图: ?...假设两个范畴是 C和D, 有一个函子functor F: C -> D ,这种写法类似函数写法,但是因为函子是范畴的函数,所以,其工作原理是进入范畴C和D内部,而范畴是由元素对象和态射箭头组成,因此函子就要分别作用于元素对象和态射箭头

    4.5K30
    领券