मैं उच्च kinded प्रकार में मेरी उंगलियों डुबकी कर रहा हूँ, एक बहुत ही बुनियादी स्काला उदाहरण की खोज:स्काला उच्च kinded प्रकार विचरण
trait Mappable[F[_]] {
def map[A, B](fa: F[A])(f: A => B): F[B]
}
object Mappable {
implicit object MappableOption extends Mappable[Option] {
def map[A, B](fa: Option[A])(f: A => B): Option[B] = fa.map(f)
}
implicit object MappableSeq extends Mappable[Seq] {
def map[A, B](fa: Seq[A])(f: A => B): Seq[B] = fa.map(f)
}
}
def bananaTuple[F[_], T](f: F[T])(implicit F: Mappable[F]): F[(String, T)] =
F.map(f)(("banana", _))
यह काम करता है:
bananaTuple(Option(42)) // Some((banana,42))
bananaTuple(Seq(42)) // List((banana,42))
लेकिन इस संकलन नहीं करता है:
bananaTuple(Some(42))
bananaTuple(List(42))
संकलन त्रुटियां मुझे मिलती हैं:
could not find implicit value for parameter F: ch.netzwerg.hkt.HigherKindedTypes.Mappable[Some] bananaTuple(Some(42))
not enough arguments for method bananaTuple: (implicit F: ch.netzwerg.hkt.HigherKindedTypes.Mappable[Some])Some[(String, Int)]. Unspecified value parameter F. bananaTuple(Some(42))
मैं गेम में भिन्नता कैसे ला सकता हूं?
मैपबल के लिए एफ तर्क invariant है, इसलिए आप इसे भिन्न एनोटेशन के साथ ठीक करने में सक्षम नहीं होंगे। – erdeszt