如何修复隐含转换为Applicative?

时间:2015-03-05 15:36:40

标签: scala scalaz applicative

这是我之前question

的后续内容

我想概括一下隐式转化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

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

1 个答案:

答案 0 :(得分:4)

M引用Adef类型,因此他们需要成为您返回的内容的一部分。我无法通过结构细化完全看到这一点,所以我认为你必须定义一个参数化类;如何定义implicit class而不是implicit def

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