找不到类型scalaz的证据参数的隐式值。适用

我试图减少这个代码(scalaz 7.0.x,scala 2.10.x):

type Error[+A] = /[String, A]
type Result[+A] = OptionT[Error, A]

进入这个:

type Result[+A] = OptionT[({ type λ[+α] = String / α })#λ, A]

并且我得到错误“无法找到scalaz类型的证据参数的隐式值。适用[Main.Result]”用于:

val result: Result[Int] = 42.point[Result]

为什么简化代码看起来不像scalac的第一个例子?


lambda类型的隐式解析似乎被破坏了。 显然,编译器首先解析类型,然后在类型参数数量上不匹配。

一个'简化'的例子:

定义一个monad和两个特征。 One类似于EitherTwo类似于EitherT

trait Monad[F[_]]

trait One[A, B]
object One {
  implicit def m[A]: Monad[({ type T[x] = One[A, x] })#T] = ???
}
trait Two[F[_], A]
object Two {
  implicit def m[F[_]]: Monad[({ type T[x] = Two[F, x] })#T] = ???
}

定义一个类型别名和一个案例类以部分应用One String作为第一个参数。 案例类版本可以用作解决方法。

type OneX[A] = One[String, A]
case class OneY[A](value: OneX[A])
object OneY {
  implicit def m(implicit ev: Monad[OneX]): Monad[OneY] = ???
}

所有'简单'类型的隐式解析工作。

implicitly[Monad[OneX]]
implicitly[Monad[({ type T[x] = One[String, x] })#T]]
implicitly[Monad[OneY]]

定义部分适用的几种类型别名Two

type TwoX[A] = Two[OneX, A]
type TwoY[A] = Two[({ type T[x] = One[String, x] })#T, A]
type TwoZ[A] = Two[OneY, A]

在这里我们看到使用lambda类型的那个失败了。

implicitly[Monad[TwoX]]
implicitly[Monad[TwoY]] // fails
implicitly[Monad[TwoZ]]

这里我们看到所有使用类型别名的lambda类型都失败。 只有实际引用具有单个参数的稳定类型的成功。

implicitly[Monad[({ type T[x] = Two[OneX, x] })#T]] // fails
implicitly[Monad[({ type T[x] = Two[OneY, x] })#T]]
implicitly[Monad[({ type T[x] = Two[({ type T[x] = One[String, x] })#T, x] })#T]] //fails

我对编译器的了解相当有限,这可能与@TravisBrown指出的错误有关。

链接地址: http://www.djcxy.com/p/21711.html

上一篇: could not find implicit value for evidence parameter of type scalaz.Applicative

下一篇: How to make authenticated requests in mocha test using supertest and agent?