首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏函数式编程语言及工具

    深圳scala-meetup-20180902(3)- Using heterogeneous Monads in for-comprehension with Monad Transformer

    如果我们把这两个类型在for-comprehension里结合使用: object session22 extends App { val ovalue: Option[Int] = Some(10 如果我们把这两个Monad结合形成一个复合的类型,那么用for-comprehension应该没什么问题,如下: object session23 extends App { def combined

    63220发布于 2018-10-11
  • 来自专栏函数式编程语言及工具

    泛函编程(27)-泛函编程模式-Monad Transformer

    更重要的是,Monad成就了for-comprehension。通过for-comprehension可以实现泛函风格的“行令编程模式(imperative programming)。 无法使用行令编程模式肯定对泛函编程过程造成诸多不便,但Monad使for-comprehension成为可能,而在for-comprehension内可以实现行令编程,所以泛函编程被称为Monadic 以上的例子中for-comprehension是由Option[Int]定义的,那么,如果这个for-comprehension是由一个以上Monad组成的呢? 那我们下面把这两个Monad在一个for-comprehension里运行。 那么所有在for-comprehension内的表达式右方就必须是StateT类型。

    1.5K70发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

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

    曾经看到一段对Monad的描述:“Monadic for-comprehension就是一种嵌入式编程语言,由它的Monad提供它的语法”。 但如果每一种Monad的for-comprehension都独立提供一套语法的话,这种编程语言就显得十分单调、功能简单了。 那么既然是FP,我们应该可以通过函数组合(function composition)来把很多简单的for-comprehension组合成一套完善的编程语言吧? 难道我们就无法使用M[N[A]]这样的for-comprehension了吗? 难道我们在使用不同要求的for-comprehension时都需要重新创建一个新类型吗,这样不就损失了FP的代码重复使用特点了吗?

    1.2K60发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    泛函编程(24)-泛函数据类型-Monad, monadic programming

    对我来说Monadic programming就是flatMap programming,其中最重要的原因是scala的for-comprehensionfor-comprehension是scala的特点,只要是Monad实例就可以用for-comprehension,也可以说只要能flatMap就可以吃到for-comprehension这块语法糖。 foldLeft(z:B)(f:(B,A)=>B)的z是个intStateMonad实例类型B,所以foldLeft的操作函数就是:(intStateMonad,A)=>intStateMonad,我们可以使用for-comprehension 在这个例子里我们了解了Monad的意义: 1、可以使用for-comprehension 2、支持泛函式的循序命令执行流程,即:在高阶类结构内部执行操作流程。

    1.1K100发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    深圳scala-meetup-20180902(1)- Monadic 编程风格

    我这次的分享主要分三个主题:“Monadic编程风格“、”Future vs Task and ReaderMonad应用方法“及”using heterogeneous monads in for-comprehension 对任何Tube类型我们都可以用for-comprehension来组合运算式,最后run来获取运算结果。以上a,b,c都是中间结果,可以在for{...}中任意使用。 Future是个Monad(虽然它不是一种纯函数impure function, 这个我们后面再解释),所以我们可以用for-comprehension来编程,如下: type FoodName = 通过上面这个例子我们可以得到这么一种对Monadic编程风格的感觉,就是:用for-comprehension来组合,组合、再组合,然后run(Await.result)获取结果。

    79430发布于 2018-09-28
  • 来自专栏函数式编程语言及工具

    Scalaz(19)- Monad: \/ - Monad 版本的 Either

    我们用for-comprehension来证明: 1 val epok = for { 2 a <- \/-(3) 3 b <- \/-(2) 4 } yield a + b \/在for-comprehension里的运算行为与Option一致。不过这个\/写法比较别扭。 } trait ToEitherOps { //可以为任何类型A注入方法 implicit def ToEitherOps[A](a: A) = new EitherOps(a) } 现在这个for-comprehension

    78250发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(33)- Free :算式-Monadic Programming

    在前面的讨论中我们介绍过:我们可以把任何F[A]升格成Monad,而Monad具备最完善的函数组合性能,特别是它支持for-comprehension这种表达方式。 我们可以在for-comprehension框架里进行我们熟悉的行令编程(imperative programming),可以使程序意思表达更加显而易见。 Exercises.interact.Quiz,Unit] = Gosub() 但是,askNumber,askOperator及answer这几个操作函数都返回了Quiz类型,而Quiz类型不是Monad,不支持for-comprehension

    70970发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

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

    我们可以从上面的flatMap串中推导出for-comprehension: 1 // for { 2 // a <- (fa: F[A]) 3 // b <- (fb: F[A ]) 4 // c <- (fc: F[A]) 5 // } yield { ... } 从for-comprehension能够更容易看出:我们可以选择在for loop内按要求连续运算 我看多数可能是实现Monad实例,这样我们就可以在自定义类型的控制下进行Monadic编程了,即在for-comprehension内进行熟悉的行令编程(imperative programming)。 很多人自定义Monad可能就是简单希望能用for-comprehension。 前面说过,for-comprehension可以是一种简单的FP编程语言Monadic language。用它编制的程序运算行为可以受定义它的Monad实例所控制。

    1.3K80发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Cats(4)- 叠加Free程序运算结果,Stacking monadic result types

    因为Monad无法实现组合(monad do not compose),我们如何在for-comprehension中组合这些运算呢? 3 4 trait Auth[+A] 5 case class Authorize(uid: String) extends Auth[Xor[String,Boolean]] 这两个ADT在for-comprehension //> res0: cats.data.Xor[String,Option[Int]] = Right(Some(80)) 9 } 我们必须用两层for-comprehension 其实不单是程序结构复杂问题,更重要的是运算效果(effect)无法正确体现:出现None和Left值时并不能立即终止for-comprehension、再就是如果第一层是有副作用(side-effect )运算时,由于我们必须先得出第一层的运算结果才能进行下一层运算,所以这个for-comprehension产生了不纯代码(impure-code),如下: 1 for { 2 optionData

    2.3K60发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(43)- 总结 :FP就是实用的编程模式

    Free Monad的出现恰恰解决我心中的疑问,更正了我对FP的偏见:Free Monad提供了一套在Monad 算法内(在 for-comprehension内)的行令编程(imperative programming 这时我们遇到了flatMap函数的方法糖for-comprehension,它可用让我们在一个for-loop里进行我们熟悉的行令式编程,就像下面这样: for { x <- getRecNo r 好了,有了Monad和各种功能转换、集合方式,我们可以在for-comprehension里进行熟悉的编程了。那么会不会出现在一个for-loop里出现几百行指令的情况呢?

    1.3K70发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(28)- ST Monad :FP方式适用变量

    (s) match { case (ns, a) => (ns, g(a)) }) } ST与State Monad极其相似,备有map和flatMap,所以是个Monad,能支持for-comprehension 我们可以通过ST的for-comprehension实现STRef,STArray操作函数的组合,因为这些操作函数的返回结果都是ST类型的。 而for-comprehension是一种串型流程,能保证线程之间不会交叉运行,相互影响各自的可变量。

    75080发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(12)- Monad:再述述flatMap,顺便了解MonadPlus

    这个推论在scala的for-comprehension中得到证实:flatMap可以被视作一种简单的FP语法,它使我们可以在for-comprehension中使用我们熟悉的行令编程,其结果是FP模式的行令编程 现在我们可以先获取KeyLog的Monad实例,然后进行flatMap串联及使用for-comprehension进行行令编程了: 1 object KeyLog { 2 def apply 看看flatMap串接和for-comprehension效果: def enterInt(k: Int): KeyLog[Int] = KeyLog(k, "Number:"+k.toString) 在使用for-comprehension时突然想到守卫函数(guard function)。 我想既然已经得到了KeyLog的Monad实例,是不是可以在它的for-comprehension里使用守卫函数呢?

    1.2K70发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(18)- Monad: ReaderWriterState-可以是一种简单的编程语言

    更直白的讲法是:任何类型只要实现了flatMap就可以用for-comprehension, for{...}yield。在这个for{...}里我们可以好像OOP一样编写程序。 我们先试试用Id,虽然Id[A]对A不做任何处理,直接返回,好像没什么意义,但这种类型具备了map和flatMap,应该可以用for-comprehension: 1 import scalaz._ 当然,如果我们想在一个for-comprehension里同时使用Option和State就必须把它们升格成OptionState类型: def liftOption[S,A](oa: Option[ def liftState[S,A](sa: State[S,A]): OptionState[S,A] = OptionState {s => sa(s).some} 现在试试用叠加效果的for-comprehension 作为for-comprehension的context应该能提供比较全面的效果。

    1.7K70发布于 2018-01-05
  • 来自专栏简易现代魔法

    不可变的状态

    直接空想相当困难,这里可以给出一个提示,那就是这里定义的 StateT 其实是一个 Monad,我们可以用 Scala 的 for-comprehension 来操作它。 什么是 Monad? 在之前的文章中我们已经多次使用过它了,但是一直没有给出其定义和说明,只说了我们可以用 for-comprehension 来进行一些方便的操作。 原因是 Scala 比较注重工程实践,虽然 for-comprehension 可以用来方便地操作 Monad,但使用上它并没有去暴露 Monad 这个概念(将 bind 改名为 flatMap 可能也是因为这个原因 所以 for-comprehension 仅要求用户定义 flatMap 和 map(部分 for-comprehension 的写法还要求定义 filter 和 foreach,此处暂不考虑)。 , lbT2) = lbST.run(0) 这个版本的 labelTree 非常简洁,但这个过程似乎有点过于神奇了,以至于让人因难以理解它如何工作而感到不安,要想知道这个过程是怎么工作的,只需要展开 for-comprehension

    1.4K20发布于 2021-08-10
  • 来自专栏函数式编程语言及工具

    Scalaz(41)- Free :IO Monad-Free特定版本的FP语法

    } 7 def tell(msg: String): MyIO[Unit] = 8 MyIO { 9 println(msg) 10 } MyIO是个Monad,我们可以在for-comprehension 这不就是option在for-comprehension的作用吗。 不过现在for-comprehension里的每句都需要用liftM[OptionT]来升格。

    1.9K90发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    泛函编程(31)-泛函IO:Free Monad-Running free

    () (),Return( 14 //| ()))))))) 看,把Interact升格后就可以使用for-comprehension 然后我们可以用这个产生的Monad来在for-comprehension里面编写一个算法。 解译运算(Interpret)是Free Monad的Interpreter功能。 sh(2,Suspend(Add(Suspend(Pop(Return(()))))))))) 我们用lisftStackOps函数把StackOps升格到Free[StackOps,A]后就可以用for-comprehension 这正是Free Monad功能精妙之处:我们用Monad for-comprehension来编写一段Monadic program,然后在Interpreter中赋予它具体意义:用Interpreter

    1.4K100发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

    Scalaz是通过Monad typeclass为数据运算的程序提供了一套规范的编程方式,如常见的for-comprehension。 为了更清楚的了解串接flatMap的意义,我们用同等的for-comprehension来示范: 1 // for { 2 // a <- (fa: F[A]) 3 // b < //> res17: Option[Exercises.monad.Barbell] = Some(Barbell(3,6)) 我们的最终目的是用for-comprehension

    1.1K100发布于 2018-01-05
  • 来自专栏简易现代魔法

    使用 Future 进行并发编程

    有了这个组合子,配合 Scala 的 for-comprehension,就可以这样写: val resultFuture = for { service <- Future { serviceFetcher.fetch 虽然 Scala 的这一套 API 很优雅,但是受限于 Java 的语法,这个设计在 Java 上却无法直接照搬,例如上面那段代码中的 for-comprehension 部分将被翻译成: val displayTextFuture searcher.search(service, config, target) } map { result => render(result) } } } 由于 Java 没有类似 for-comprehension

    1.4K20发布于 2021-08-10
  • 来自专栏函数式编程语言及工具

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

    有了Monad特性我们可以在for-comprehension这个封闭的环境里进行行令编程 1 val word = for { 2 x <- Box("Hello") 3 注意:在for-comprehension这个环境里,运算对象x,y,z,w都是脱了衣服的基础类型。这样我们才能采用熟悉的编程方式工作。

    1.3K60发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(13)- Monad:Writer - some kind of logger

    当然我们必须获取Logger的Monad实例才能使用for-comprehension。 (la: Logger[LOG,A])(f: A => Logger[LOG,B]): Logger[LOG,B] = la flatMap f 5 } 6 } 有了Monad实例我们可以使用for-comprehension

    1.2K100发布于 2018-01-05
领券