这是我之前question
的后续内容我想概括一下隐式转化toApplicative
,它将方法<*>
添加到任何M[A=>B]
,其中M
是Applicative
(即有一个类型类实例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
您如何建议实施这种隐式转换?
答案 0 :(得分:4)
从M
引用A
和def
类型,因此他们需要成为您返回的内容的一部分。我无法通过结构细化完全看到这一点,所以我认为你必须定义一个参数化类;如何定义implicit class
而不是implicit def
?
implicit class PimpedApplicative[M[_]: Applicative, A, B](mf: M[A => B]) {
def <*>(ma: M[A]) = Applicative[M].ap(ma)(mf)
}