12
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,1), (three,1))
내가는 경우 문의 라인을 변경하여 작업을 얻을 수 있습니다 :
case x :: xs => (init[Int]) map { s : Int => (x -> s) :: (numberSA(xs) ! (s + 1)) }
을하지만 이것은 단지 잘못된 느낌 내가 말했듯이, 그것은 작동하지 않습니다. 누구든지 도와 줄 수 있습니까?
편집-더 주위가 개선 될 수있는이
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)) { _ ::: _ }
}
}
에 저를 가지고 연주? 그것 이외의 다른 컨테이너에 일반화 될 수 List
(그리고, 만약 그렇다면, 어떤 typeclasses가 필요합니까?)
편집 2-지금 clunkily 조금이기는하지만, 그것을 일반화 한
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)} })
}
또는 매우 유사한
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)} })
}
그리고 나에게는 모든 것이 영리하다고 느꼈다. –