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

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
全部评论

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务