scala – 如何使用Name作为应用程序?
scala> val a = Need(20) a: scalaz.Name[Int] = scalaz.Name$$anon$2@173f990 scala> val b = Need(3) b: scalaz.Name[Int] = scalaz.Name$$anon$2@35201f scala> for(a0 <- a; b0 <- b) yield a0 + b0 res90: scalaz.Name[Int] = scalaz.Name$$anon$2@16f7209 scala> (a |@| b) res91: scalaz.ApplicativeBuilder[scalaz.Name,Int,Int] = scalaz.ApplicativeBuilde r@11219ec scala> (a |@| b) { _ + _ } <console>:19: error: ambiguous implicit values: both method FunctorBindApply in class ApplyLow of type [Z[_]](implicit t: scala z.Functor[Z],implicit b: scalaz.Bind[Z])scalaz.Apply[Z] and value nameMonad in object Name of type => scalaz.Monad[scalaz.Name] match expected type scalaz.Apply[scalaz.Name] (a |@| b) { _ + _ } ^ 名字是Monad,因此也是一个适用者.为什么这段代码不起作用呢?我是否需要添加任何类型的注释才能使其正常工作?谢谢! 解决方法
只是部分答案,我对scalaz不太熟悉. (a | @ | b)是ApplicativeBuilder [Name,Int].你的apply(加号:(Int,Int)=> Int)调用需要两个隐式参数,一个Functor [Name]和一个Apply [Name](比Applicative少一点,没有pure).
第二个有问题.由于Name出现在Apply [Name]类型中,伴随对象Name被认为是隐式作用域,因此隐式val nameMonad:Monad [Name]位于隐式作用域中.由于Monad扩展了Applicative,它扩展了Apply,因此它可能是隐含参数的候选者. 但是当Apply在Apply [Name]中显示其伴随对象Apply时,也考虑了伴随对象Apply.在它的祖先ApplyLow中,有一个 implicit def FunctorBindApply[Z[_]](implicit t: Functor[Z],b: Bind[Z]): Apply[Z] Functor [Name]和Bind [Name]的实例存在于隐式作用域中(nameMonad都是它们),因此FunctorBindApply也提供候选Apply(其行为与nameMonad完全相同,因为它完全基于它,但它是另一个然而,候选人). 我不认为我真的了解优先权规则.在ApplyLow中定义而不是Apply会降低相对于随附对象Apply中定义的内容的优先级.但不相对于无关对象名称中定义的内容.我不认为Monad是Apply的子类型,因为它更具体.我认为没有其他规则可以在两者之间作出决定,但我必须承认我在那里有点不知所措.编译器错误消息肯定同意它可以在备选方案之间进行选择. 不确定正确的解决方案应该是什么,但是将nameMonad直接放在范围内,例如使用import Name._应该优先考虑. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |