基本的斯卡拉兹州问题
发布时间: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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |