如何修复到 Applicative 的隐式转换?

How to fix implicit conversion to Applicative?

这是我之前

的后续

我想推广隐式转换 toApplicative,它将方法 <*> 添加到任何 M[A=>B],其中 MApplicative(即有是类型类实例 Applicative[M])

implicit def toApplicative[M[_], A, B](mf: M[A=>B])(implicit apm: Applicative[M]) = 
   new { def<*>(ma: M[A]) = apm.ap(ma)(mf) }

不幸的是我遇到了一个错误:

   <console>:25: error: Parameter type in structural refinement 
            may not refer to an abstract type defined outside that refinement

您建议如何实现这种隐式转换?

类型 MA 是从您的 def 中引用的,因此它们需要是您返回的内容的一部分。我看不出有什么方法可以通过结构改进来完全做到这一点,所以我认为你必须定义一个参数化的 class;如何定义 implicit class 而不是 implicit def

implicit class PimpedApplicative[M[_]: Applicative, A, B](mf: M[A => B]) {
  def <*>(ma: M[A]) = Applicative[M].ap(ma)(mf)
}