返回信息流目前,我觉得库作者设计API的时候,按照Monad的规则去设计,会更好用(没想到合适的形容词-_-), 除此之外还有什么用处呢?
这是一条镜像帖。来源:北邮人论坛 / java / #45559同步于 2015/11/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
写Scala时,理解Monad有什么用处?
kuibu
2015/11/17镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
还没弄好啊,在做一个分布式机器学习系统,目前还没有啥进度。不过,之前在一个类似的项目中打过酱油。
准备在定义一些类型如矩阵、向量、图等时,满足monad原则。
【 在 nuanyangyang 的大作中提到: 】
: 好厉害!说说你设计了什么monad吧
【 在 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都是一样的?
大神,弄了怎么样了?
【 在 kuibu 的大作中提到: 】
: 还没弄好啊,在做一个分布式机器学习系统,目前还没有啥进度。不过,之前在一个类似的项目中打过酱油。
: 准备在定义一些类型如矩阵、向量、图等时,满足monad原则。
我擦,一句没看明白。
【 在 nuanyangyang 的大作中提到: 】
:
: monad本质上是类似“函数组合”一样的连接操作。
: 传统的函数组合是
: ...................
膜暖神
【 在 nuanyangyang 的大作中提到: 】
:
: monad本质上是类似“函数组合”一样的连接操作。
: 传统的函数组合是
: ...................