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

基本的斯卡拉兹州问题

发布时间:2020-12-16 09:11:43 所属栏目:安全 来源:网络整理
导读:如何使用State来模拟List.zipWithIndex的行为?到目前为止我所想到的(不行)是: def numberSA[A](list : List[A]) : State[Int,List[(A,Int)]] = list match { case x :: xs = (init[Int] * modify((_:Int) + 1)) map { s : Int = (x - s) :: (numberSA(xs)
如何使用State来模拟List.zipWithIndex的行为?到目前为止我所想到的(不行)是:

def numberSA[A](list : List[A]) : State[Int,List[(A,Int)]] = list match {
  case x :: xs => (init[Int] <* modify((_:Int) + 1)) map { s : Int => (x -> s) :: (numberSA(xs) ! s) }
  case Nil     => state( (i : Int) => i -> nil[(A,Int)] )
}

这是非常松散的state example.正如我所说,它不工作:

scala> res4
res5: List[java.lang.String] = List(one,two,three)

scala> numberSA(res4) ! 1
res6: List[(String,Int)] = List((one,1),(two,(three,1))

我可以通过更改案例语句的一行来获得它的工作:

case x :: xs => (init[Int]) map { s : Int => (x -> s) :: (numberSA(xs) ! (s + 1)) }

但这只是感觉错了.谁能帮忙?

编辑 – 更多的玩弄让我这样做

def numberSA[A](list : List[A]) : State[Int,Int)]] = {
  def single(a : A) : State[Int,Int)]] = (init[Int] <* modify((_ : Int) + 1)) map { s : Int => List(a -> s) }
  list match {
    case Nil     => state( (_ : Int) -> nil[(A,Int)] )
    case x :: xs => (single(x) <**> numberSA(xs)) { _ ::: _ }
  }
}

可以改进吗?可以将其推广到List以外的容器(如果是,需要什么类型类型)?

编辑2 – 我已经把它概括了一下,尽管有点笨拙

def index[M[_],A](ma : M[A])
      (implicit pure : Pure[M],empty : Empty[M],semigroup : Semigroup[M[(A,Int)]],foldable : Foldable[M]) 
      : State[Int,M[(A,Int)]] = (init[Int] <* modify((_ : Int) + 1)) map { s : Int => pure.pure(a -> s) }
  foldable.foldLeft(ma,state( (_ : Int) -> empty.empty[(A,Int)] ),{ (s : State[Int,a : A) => (s <**> single(a)) { (x,y) => semigroup.append(x,y)}  } )
}

或者非常相似:

def index[M[_] : Pure : Empty : Plus : Foldable,A](ma : M[A]) 
     : State[Int,Int)]] = {
  import Predef.{implicitly => ??}
  def single(a : A) : State[Int,Int)]] = (init[Int] <* modify((_ : Int) + 1)) map { s : Int => ??[Pure[M]].pure(a -> s) }
  ??[Foldable[M]].foldLeft(ma,state( (_ : Int) -> ??[Empty[M]].empty[(A,y) => ??[Plus[M]].plus(x,y)}  } )
}

解决方法

def index[M[_]:Traverse,A](m: M[A]) =
  m.traverse[({type λ[x] = State[Int,x]})#λ,(A,Int)](a =>
    state(i => (i + 1,(a,i)))) ! 0

甚至…

def index[M[_]:Traverse,Int)](a =>
    (Lens.self[Int] += 1) map ((a,_)) ! -1

有关使用状态遍历的??更多信息,请参见The Essence of the Iterator Pattern.

(编辑:李大同)

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

    推荐文章
      热点阅读