用于测试的代码:
import scalaz.{Reader, Applicative}
class ReaderInstanceTest {
type IntReader[A] = Reader[Int, A]
val a = Applicative[({type l[A] = Reader[Int, A]})#l] // fine
val b = Applicative[IntReader]
// ^ ambigous implicit values
// both method kleisliMonadReader ..
// and method kleisliIdMonadReader ..
}
这与 Scala 相关吗类型构造函数推理的高阶统一 https://issues.scala-lang.org/browse/SI-2712票?如果是这样(即使不是),您能否描述一下 a 和 b 情况下发生了什么?
您是否有关于何时使用 lambda 类型以及何时使用类型别名的指南,以便从长远来看一切正常,不会出现意外错误?
是的,这与 SI-2712 有关。
kleisliIdMonadReader
仅用于指导类型推断;它只是转发到kleisliMonadReader
。通过提供类型别名IntReader
,scalac 不需要这种帮助,并且可以推断出类型参数kleisliMonadReader
直接地。这导致了歧义。
我刚刚采取了一种补救措施:我们可以通过在子类中定义一个来确定这些隐式相对于彼此的优先级。
https://github.com/scalaz/scalaz/commit/6f9ae5f https://github.com/scalaz/scalaz/commit/6f9ae5f
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)