나는 a가 Seq[R]
있고 이것을으로 나누고 싶습니다.이를 Tuple2[Seq[E], Seq[S]]
코딩하는 동안 Bifunctor
seq의 튜플에 대해 사용자 정의 를 사용할 수 있다는 사실에 대해 생각 하고 연습하면서 이것을 코딩하려고했습니다.
import scalaz.Bifunctor
type MyType[E, S] = (Seq[E], Seq[S])
case class MyVali[E, S](tp: (Seq[E], Seq[S]))(implicit bifunctor: Bifunctor[MyType]) {
def bimap[C, D](f: (E) => C, g: (S) => D): (Seq[C], Seq[D]) =
bifunctor.bimap(tp)(f, g)
def leftMap[C](f: (E) => C): (Seq[C], Seq[S]) =
bifunctor.leftMap(tp)(f)
def rightMap[D](g: (S) => D): (Seq[E], Seq[D]) =
bifunctor.rightMap(tp)(g)
}
val myValBifunctorInstance = new Bifunctor[MyType] {
override def bimap[A, B, C, D](fab: (Seq[A], Seq[B]))(f: (A) => C, g: (B) => D): (Seq[C], Seq[D]) =
(fab._1.map(f), fab._2.map(g))
}
MyVali((Seq.empty[String], Seq.empty[Int]))(myValBifunctorInstance).bimap(a => a, b => b)
이것은 잘 작동하지만 어떤 이유로 나에게 모호한 이유로이 모든 컴파일을 만들기 위해 매개 변수 형식 별칭을 선언해야했습니다. 즉 type MyType[E, S] = (Seq[E], Seq[S])
, 이것이 작동하지 않는 이유를 거의 이해하지 못합니다.
def myValBimap[E, S] = new Bifunctor[Tuple2[Seq[E], Seq[S]]] {
override def bimap[A, B, C, D](fab: (A, B))(f: (A) => C, g: (B) => D): (C, D) = ???
}
[오류] ... (Seq [E], Seq [S])에는 유형 매개 변수가 없습니다. 예상 됨 : 2 개
[오류] def myValBimap [E, S] = new Bifunctor [Tuple2 [Seq [E], Seq [S]]] {
그런 유형 별칭이 정의 될 때 컴파일러가 2 가지 유형의 중단 (중첩 된 람다 유형과 같은)을 생성합니까?
def myValBimap[E, S] = new Bifunctor[Tuple2[Seq[E], Seq[S]]] { ... }
Tuple2[...]
에서 Bifunctor
때문에 위의 더 이상 두 가지 유형 매개 변수가없는 E
및이 S
채워집니다.
예를 들어 myValBimap[Int, String]
a를 만들려고 시도 Bifunctor[(Seq[Int], Seq[String])]
하고 유형 (Seq[Int], Seq[String])
에는 두 가지 유형 매개 변수가 분명히 없습니다.
당신은 쓸 수 있습니다
Bifunctor[({ type λ[α, β] = (Seq[α], Seq[β])})#λ]
또는 Bifunctor[λ[(α, β) => (Seq[α], Seq[β])]]
종류 프로젝터 플러그인을 사용합니다.추가 유형이 필요한 경우 유형 매개 변수가있는 암시 적 함수가 필요합니다.
implicit def myBimap[F[_]: Functor]: Bifunctor[λ[(α, β) => (F[α], F[β])]] = ???
더 간단한 예는 Functor
for disjunction / \/
이며 왼쪽에 유형 매개 변수를 사용합니다.
implicit def functorDisj[L]: Functor[L \/ ?] = ???
implicit def functorDisj[L]: Functor[({ type λ[α] = L \/ α })#λ] = ???
원래 문제 정보 :에 매핑하고 다음 R
을 E \/ S
사용할 수 있습니다 separate
.
import scalaz._, Scalaz._
val integers = List.range(1,10)
val stringOrInts: List[String \/ Int] =
integers.map(i => if (i % 2 == 0) i.right else i.toString.left)
stringOrInts.separate
// (List[String], List[Int]) = (List(1, 3, 5, 7, 9),List(2, 4, 6, 8))
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다