Scala – 作家Monad是否与国家Monad有效地相同?
发布时间:2020-12-16 09:19:36 所属栏目:安全 来源:网络整理
导读:有一个很棒的教程 here,似乎向我建议,作者Monad基本上是一个特殊情况的元组对象,代表(A,B)进行操作.作者积累了左边的值(A),A有一个相应的Monoid(因此它可以累加或变异状态).如果A是一个集合,那么它会累积. State Monad也是处理内部元组的对象.他们都可以是fl
有一个很棒的教程
here,似乎向我建议,作者Monad基本上是一个特殊情况的元组对象,代表(A,B)进行操作.作者积累了左边的值(A),A有一个相应的Monoid(因此它可以累加或变异状态).如果A是一个集合,那么它会累积.
State Monad也是处理内部元组的对象.他们都可以是flatMap’d,map’d等等,操作看起来和我一样.他们有什么不一样? (请回复一个scala的例子,我不熟悉Haskel).谢谢! 解决方法
你的直觉,这两个单体是密切相关的是完全正确的.不同的是,作家受到的限制很大,因为它不允许你读取累积的状态(直到你最后退出).在作家中唯一可以做的事情就是把更多的东西放在最后.
更简洁地说,州[S,A]是一种S => (S,A),而Writer [W,A]是(W,A)的包装器. 考虑Writer的以下用法: import scalaz._,Scalaz._ def addW(x: Int,y: Int): Writer[List[String],Int] = Writer(List(s"$x + $y"),x + y) val w = for { a <- addW(1,2) b <- addW(3,4) c <- addW(a,b) } yield c 现在我们可以运行计算: scala> val (log,res) = w.run log: List[String] = List(1 + 2,3 + 4,3 + 7) res: Int = 10 我们可以和国家做同样的事情: def addS(x: Int,y: Int) = State((log: List[String]) => (log |+| List(s"$x + $y"),x + y)) val s = for { a <- addS(1,2) b <- addS(3,4) c <- addS(a,b) } yield c 接着: scala> val (log,res) = s.run(Nil) log: List[String] = List(1 + 2,3 + 7) res: Int = 10 但是这有点更冗长,我们也可以与国家做很多其他的事情,我们无法用Writer做. 所以这个故事的道德是你应该使用Writer,只要你可以 – 你的解决方案会更清洁,更简洁,你会得到使用适当的抽象的满意度. 很多时候,作家不会给你所有的权力,但在这种情况下,国家将等待你. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |