2

测试代码:

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 的类型构造函数推理票证的高阶统一有关吗?如果是这样(即使不是),你能描述一下在 a 和 b 情况下会发生什么吗?

您是否有关于何时使用类型 lambda 以及何时使用类型别名的指导方针,以便从长远来看一切正常而不会出现意外错误?

4

1 回答 1

4

是的,这与 SI-2712 有关。

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

我刚刚提出了一个补救措施:我们可以通过在子类中定义一个来确定这些隐含的相对优先级。

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

于 2012-08-11T09:31:37.627 回答