BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #45559同步于 2015/11/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

写Scala时,理解Monad有什么用处?

kuibu
2015/11/17镜像同步6 回复
目前,我觉得库作者设计API的时候,按照Monad的规则去设计,会更好用(没想到合适的形容词-_-), 除此之外还有什么用处呢?
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
nuanyangyang机器人#1 · 2015/11/17
好厉害!说说你设计了什么monad吧[ema23]
kuibu机器人#2 · 2015/11/18
还没弄好啊,在做一个分布式机器学习系统,目前还没有啥进度。不过,之前在一个类似的项目中打过酱油。 准备在定义一些类型如矩阵、向量、图等时,满足monad原则。 【 在 nuanyangyang 的大作中提到: 】 : 好厉害!说说你设计了什么monad吧
nuanyangyang机器人#3 · 2015/11/18
【 在 kuibu 的大作中提到: 】 : 还没弄好啊,在做一个分布式机器学习系统,目前还没有啥进度。不过,之前在一个类似的项目中打过酱油。 : 准备在定义一些类型如矩阵、向量、图等时,满足monad原则。 monad本质上是类似“函数组合”一样的连接操作。 传统的函数组合是 f: A -> B g: B -> C 如果令h = f.andThen(g),那么 h: A -> C h就是把f和g合起来合成一个新函数。h(x) == g(f(x)) 但是monad是组合两个比较“怪”的函数: f: A -> M[B] g: B -> M[C] 这里M可以是任何东西,最常见的应该是M就是Seq。 如果 f: A -> Seq[B] g: B -> Seq[C] 我们可以用类似函数组合的方法把它们组合成一个h函数: h: A -> Seq[C] h(x)做的事是:先求f(x),它返回一个B列表。然后对列表里每个元素y求g(y),每个返回一个C列表。最后,把各个C列表串接起来形成一个大的C列表。这样,就组合了f和g这两个函数。 如果你能写出一个类似“andThen”一样的运算符来组合上述两个函数,你就设计了一个monad。 另一种情况,如果 f: A -> Option[B] g: B -> Option[C] 意思是f和g都可能出错,有可能返回一个值Some(v),或者不返回值,即None。我想设计一个函数h h: A -> Option[C] h(x)做的事是先求f(x),如果返回Some(y),就返回g(y);如果f返回了None,就直接返回None。这样,就组合了f和g这两个函数。h只有当f和g都成功的时候才返回Some,只要有一个失败了就返回None。 如果你能写出一个类似“andThen”一样的运算符来组合上述两个函数,你就设计了一个monad。 另一种情况,如果 f: A -> Either[String, B] g: B -> Either[String, C] 意思是f和g都可能出错,有可能返回一个有意义的值Right(v),或者出错,用Left(errMsg)来表示。我想设计一个函数h h: A -> Either[String, C] h(x)做的事是先求f(x),如果返回Right(y),就返回g(y);如果f返回了Left(errMsg),就直接返回Left(errMsg)。这样,就组合了f和g这两个函数。h只有当f和g都成功的时候才返回Right,只要有一个失败了就返回它给出的Left(errMsg)。 如果你能写出一个类似“andThen”一样的运算符来组合上述两个函数,你就设计了一个monad。 对于Seq[T]的情况,Java和Python程序猿会这样写: def h(x: A): Seq[C] = { for (y <- f(x); z <- g(y)) yield z } 以前用过Haskell的重度中毒程序猿会这样写: def h: A => Seq[C] = x => f(x).flatMap(y => g(y)) 对于Option[T]的情况,Java和Python程序猿会这样写: def h(x: A): Option[C] = { for (y <- f(x); z <- g(y)) yield z } 以前用过Haskell的重度中毒程序猿会这样写: def h: A => Option[C] = x => f(x).flatMap(y => g(y)) p.s. 这代码怎么看着这么眼熟? 对于Either[T1,T2]的情况,Java和Python程序猿会这样写: def h(x: A): Either[String, C] = { for (y <- f(x); z <- g(y)) yield z } 以前用过Haskell的重度中毒程序猿会这样写: def h: A => Either[String, C] = x => f(x).flatMap(y => g(y)) p.s. 这代码怎么看着还是这么眼熟?难道说Seq,Option和Either都是一样的?
wangqiudsc机器人#4 · 2016/8/1
大神,弄了怎么样了? 【 在 kuibu 的大作中提到: 】 : 还没弄好啊,在做一个分布式机器学习系统,目前还没有啥进度。不过,之前在一个类似的项目中打过酱油。 : 准备在定义一些类型如矩阵、向量、图等时,满足monad原则。
HB0318机器人#5 · 2016/8/2
我擦,一句没看明白。 【 在 nuanyangyang 的大作中提到: 】 : : monad本质上是类似“函数组合”一样的连接操作。 : 传统的函数组合是 : ...................
lucashood机器人#6 · 2018/7/23
膜暖神 【 在 nuanyangyang 的大作中提到: 】 : : monad本质上是类似“函数组合”一样的连接操作。 : 传统的函数组合是 : ...................