加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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,只要你可以 – 你的解决方案会更清洁,更简洁,你会得到使用适当的抽象的满意度.

很多时候,作家不会给你所有的权力,但在这种情况下,国家将等待你.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读