Scara의 foldLeft가 뭐였더라?

10409 단어 Scalatech
Scara는 3년 정도 썼지만 foldLeft, foldRight를 거의 사용하지 않는다.산그리아 튜토리얼[1]을 했다면 조우해서 뭘 하고 있었는지 생각이 안 나서 재조사했다.
문제 코드.
  def getVotesByRelationIds(rel: RelationIds[Vote]): Future[Seq[Vote]] = db.run(
    Votes.filter { vote =>
      rel.rawIds
        .collect({
          case (SimpleRelation("byUser"), ids: Seq[Int]) => vote.userId inSet ids
          case (SimpleRelation("byLink"), ids: Seq[Int]) => vote.linkId inSet ids
        })
        .foldLeft(true: Rep[Boolean])(_ || _) // ← なにやってんだっけ…
    }.result
  )
결과적으로 foldLeft의 내용을 진지하게 쓰면 이렇다
      .foldLeft(true: Rep[Boolean]) { (acc, rep) => acc || rep }

생각나다


사인 좀 봐.왼쪽에서 오른쪽으로 스캔하다.z는 초기값이고 op의 첫 번째 파라미터는 accumuulator이다.
def foldLeft[B](z: B)(op: (B, A) => B): B
구체적인 예로 감각을 회복한다.왼쪽부터 순서대로: 1:Nil→2:List(1)→3:List(2,1)
Seq(1, 2, 3).foldLeft(Nil: List[Int])((acc, x) => x :: acc)
// List(3, 2, 1)
밑줄을 사용하여 생략하여 쓰는 경우.위의 예의범절은 다음과 같이 쓸 수 있다.(_ :+ _) 요컨대((_: List[Int]), (_: Int)).엉덩이에 요소를 넣는 것은 요소 수에 따라 시간을 선형적으로 소비하는 것으로 좋지 않지만 예이기 때문에 신경 쓰지 마세요.
Seq(1, 2, 3).foldLeft(Nil: List[Int])((acc, x) => acc :+ x)
Seq(1, 2, 3).foldLeft(0)(_ :+ _)
밑줄을 사용하는 경우 acc, x의 순서를 지키지 않으면 안 되기 때문에 다음과 같이 바꾸면 욕을 먹기 때문(acc :: x)으로 설명한다.
Seq(1, 2, 3).foldLeft(Nil: List[Int])((acc, x) => x :: acc)
Seq(1, 2, 3).foldLeft(Nil: List[Int])(_ :: _) // error: value :: is not a member of Int
그나저나 value:is not a member of Int가 이런 느낌이라고 해서 뒤집혔어요.
1 :: 2 :: Nil
Nil.::(2).::(1)

기타


foldRight에 관해서는 이 문장도 참고할 수 있다
https://dev.classmethod.jp/articles/scala-foldright-foldleft/
각주
https://www.howtographql.com/graphql-scala/7-relations/ ↩︎

좋은 웹페이지 즐겨찾기