Scala函数式程序设计 week1 For Expressions and Monads

来源:互联网 发布:php二手交易网站源码 编辑:程序博客网 时间:2024/06/07 14:33

For表达式

For表达式的翻译

Scala编译器将for表达式翻译成map,faltMap,filter的懒变形。
以下函数都可以用for表达式的形式定义
这里写图片描述

for(x <- e1) yield e2//翻译成e1.map(x=>e2)//-----------------------------------for(x <- e1 if f; s) yield e2//f是一个filters是一个可能为空的生成器或filter序列,翻译成for(x<-e1.withFilter(x=>f);s) yield e2//翻译会在新的表达上继续进行`withFilter`是`filter`的一种变种,不产生中间列表。//-----------------------------------for(x <- e1; y<- e2;s) yield e3//翻译成e1.flatMap(x => for (y <- e2;s) yield e3)

For表达式中模式匹配的翻译

这里写图片描述

Monads

具有mapflatMap的数据结构很常见。
事实上有一个名字描述这种带有一些代数法则的数据结构的类,叫做monada.
这里写图片描述
这里写图片描述

monads 和map

map可以在每个monad中定义成flatMap和unit的组合

m map f == m flatMap (x => unit(f(x)))        == m flatMap (f andThen unit) 

monad法则

要证明一个monad,一个类型必须满足三个条件

  • 结合性
m flatMap f flatMap g == m flatMap (x => f(x) flatMap g)
  • Left unit
unit(x) flatMap f == f(x)
  • Right unit
m flatMap unit == m
原创粉丝点击