如何修复到 Applicative 的隐式转换?
How to fix implicit conversion to Applicative?
这是我之前
的后续
我想推广隐式转换 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
您建议如何实现这种隐式转换?
类型 M
和 A
是从您的 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)
}
这是我之前
我想推广隐式转换 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
您建议如何实现这种隐式转换?
类型 M
和 A
是从您的 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)
}