oxb*_*kes 12 functional-programming scala state-monad scalaz
我如何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)] )
}
Run Code Online (Sandbox Code Playgroud)
这基于状态示例非常松散.正如我所说,它不起作用:
scala> res4
res5: List[java.lang.String] = List(one, two, three)
scala> numberSA(res4) ! 1
res6: List[(String, Int)] = List((one,1), (two,1), (three,1))
Run Code Online (Sandbox Code Playgroud)
我可以通过更改case语句的一行来使它工作:
case x :: xs => (init[Int]) map { s : Int => (x -> s) :: (numberSA(xs) ! (s + 1)) }
Run Code Online (Sandbox Code Playgroud)
但这只是错了.有人可以帮忙吗?
编辑 - 更多的游戏让我有了这个
def numberSA[A](list : List[A]) : State[Int, List[(A, Int)]] = {
def single(a : A) : State[Int, List[(A, 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)) { _ ::: _ }
}
}
Run Code Online (Sandbox Code Playgroud)
可以改进吗?它可以推广到除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)]] = {
def single(a : A) : 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, M[(A, Int)]],a : A) => (s <**> single(a)) { (x,y) => semigroup.append(x,y)} } )
}
Run Code Online (Sandbox Code Playgroud)
或者非常相似:
def index[M[_] : Pure : Empty : Plus : Foldable, A](ma : M[A])
: State[Int, M[(A, Int)]] = {
import Predef.{implicitly => ??}
def single(a : A) : State[Int, M[(A, Int)]] = (init[Int] <* modify((_ : Int) + 1)) map { s : Int => ??[Pure[M]].pure(a -> s) }
??[Foldable[M]].foldLeft(ma, state( (_ : Int) -> ??[Empty[M]].empty[(A, Int)] ), { (s : State[Int, M[(A, Int)]],a : A) => (s <**> single(a)) { (x,y) => ??[Plus[M]].plus(x,y)} } )
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
甚至...
def index[M[_]:Traverse, A](m: M[A]) =
m.traverse[({type ?[x] = State[Int,x]})#?, (A, Int)](a =>
(Lens.self[Int] += 1) map ((a, _)) ! -1
Run Code Online (Sandbox Code Playgroud)
有关遍历状态的更多信息,请参阅迭代器模式的本质.
| 归档时间: |
|
| 查看次数: |
1462 次 |
| 最近记录: |