List[T[_]].sequence와 마찬가지로, List.sequence를 원합니다.

cats에서 List[T[U]] 와 같은List의 끼워넣기식 매개 변수 (주) 만 가져오면 .sequence 로 변환할 수 있습니다.
import cats.implicit._
val xs: List[Future[String]] = ...
xs.sequence // Future[List[String]]
주) 엄격히 상속해야 한다T[List[U]]그러나 2.12 이전의 scala의 경우 Either는 두 가지 유형의 매개 변수가 있는데 이렇게 하면 안 된다Apprecative[_].
val xs: List[Either[E, String]] = ...
xs.sequence // compiler error!
먼저 모듈 별명을 붙여서 컴파일할 수 있지만 귀찮아요.
type MyEither[T] = Either[MyError, T]
val xs: List[MyEither[String]] = ...
xs.sequence // MyEither[List[String]]
그런데 대단해요. 컴파일러 옵션만 추가하면 신기해요.

build.sbt


scalacOptions += "-Ypartial-unification"
val xs: List[Either[MyError, String]] = ...
xs.sequence // Future[Either[MyError, String]]
.sequence 사용하기 좋은 것 같아요.

"partial-unification"이 뭐예요?


여러 유형의 매개변수를 선택하는 유형이 있는 경우 컴파일러에서 유형 매개변수의 최오른쪽을 유일한 유형 매개변수와 동일한 옵션으로 간주합니다..sequence에서 보듯이 본명이 오른쪽인 유형 파라미터의 유형은 유효하지만 본명이 왼쪽인 유형 파라미터의 유형에서는 잘못된 추론이 발생할 수 있으므로 주의해야 한다.

좋은 웹페이지 즐겨찾기