要测试的代码:
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的higher-order unification for type constructor inference票证有关吗?如果是这样(即使没有),你能描述a和b案件中发生的事情吗?
您是否有关于何时使用类型lambda以及何时使用类型别名的指导原则,以便从长远来看一切正常而没有意外错误?
答案 0 :(得分:4)
是的,这与SI-2712有关。
kleisliIdMonadReader
仅用于指导类型推断;它只是转发到kleisliMonadReader
。通过提供类型别名IntReader
,scalac不需要此帮助,并且可以直接推断kleisliMonadReader
的类型参数。这导致了歧义。
我刚刚提出了一个补救措施:我们可以通过在子类中定义一个来相互优先考虑这些含义。