簡體   English   中英

上下文綁定到更高種類的類型?

[英]Context bound for higher kinded types?

我想做這樣的事情:

def fold[C[A]](implicit ev: Foldable[A]): A

not found: type A

我知道,我可以這樣做:

def fold[C[_], A: Foldable]: A

但是,我寧願將其作為fold[List[Int]]不是fold[List, Int]

這是我想出的:

trait Foo[T, A]

implicit def makeFoo[A, M[_]] = new Foo[M[A], A] {}

class Helper[T] {
  def apply[A]()(implicit ev: Foo[T, A]) = ev 
}

def bar[T] = new Helper[T]

bar[List[Int]]()
//Foo[List[Int],Int] = $anon$1@7edf6563

如果您真的想要一個無參數的方法,那么空對括號可能不是理想的選擇,但是我目前無法解決該問題。

我玩了一點,並提出了一個輔助類型類:

trait Helper[M[_], CA] {
  type C[_]
  type A
  implicit def ma: M[A]
}
object Helper {
  implicit def instance[M0[_], C0[_], A0](implicit ma0: M0[A0]) = new Helper[M0, C0[A0]] {
    type C[X] = C0[X]
    type A = A0
    val ma: M0[A0] = ma0
  }
}

我知道名稱非常通用,建議您找到更有意義的名稱。

現在,您不再需要Foldable[A]類型的隱式,而是需要Helper[Foldable, CA]的隱式,其中CA是您的示例中必須與List[Int]相匹配的類型:

def fold[CA](implicit helper: Helper[Foldable, CA]): helper.A

舉個例子:

def fold[CA](implicit helper: Helper[Foldable, CA]): helper.A = {
  import helper._
  println(implicitly[Foldable[A]])
  null.asInstanceOf[A]
}

scala> :paste
// Entering paste mode (ctrl-D to finish)
case class Foldable[A](name: String)
implicit val stringFoldable = Foldable[String]("String")
implicit val intFoldable = Foldable[Int]("Int")
implicit val floatFoldable = Foldable[Float]("Float")

def fold[CA](implicit helper: Helper[Foldable, CA]): helper.A = {
  import helper._
  println(implicitly[Foldable[A]])
  null.asInstanceOf[A]
}
// Exiting paste mode, now interpreting.

defined class Foldable
stringFoldable: Foldable[String] = Foldable(String)
intFoldable: Foldable[Int] = Foldable(Int)
floatFoldable: Foldable[Float] = Foldable(Float)
fold: [CA](implicit helper: Helper[Foldable,CA])helper.A

scala> fold[List[String]]
Foldable(String)
res0: String = null

scala> fold[List[Int]]
Foldable(Int)
res1: Int = 0

scala> fold[List[Float]]
Foldable(Float)
res2: Float = 0.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM