加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

找不到scalaz.Applicative类型的证据参数的隐含值

发布时间:2020-12-16 19:14:00 所属栏目:安全 来源:网络整理
导读:我正在尝试减少此代码( 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.Applicative [Main.Re
我正在尝试减少此代码( 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.Applicative [Main.Result]类型的证据参数的隐含值”:

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

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

解决方法

lambda类型的隐式解析似乎被破坏了.显然,编译器首先去掉类型,然后对类型参数的数量进行不匹配.

一个’简化’的例子:

定义一个monad和两个特征.一个类似于Either.两个类似于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] = ???
}

定义类型别名和案例类以部分应用一个字符串作为第一个参数.案例类版本可用作变通方法.

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]]

定义部分应用两个的几个类型别名

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]] //fails

我对编译器的了解相当有限,这可能与@TravisBrown指向的bug有关.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读