Scalaz 7 - 为什么使用类型别名会导致Reader的类型类分辨率模糊不清

时间:2012-08-11 08:13:44

标签: scala scalaz scalaz7

要测试的代码:

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以及何时使用类型别名的指导原则,以便从长远来看一切正常而没有意外错误?

1 个答案:

答案 0 :(得分:4)

是的,这与SI-2712有关。

kleisliIdMonadReader仅用于指导类型推断;它只是转发到kleisliMonadReader。通过提供类型别名IntReader,scalac不需要此帮助,并且可以直接推断kleisliMonadReader的类型参数。这导致了歧义。

我刚刚提出了一个补救措施:我们可以通过在子类中定义一个来相互优先考虑这些含义。

https://github.com/scalaz/scalaz/commit/6f9ae5f