Scalaz 7 - 为什么使用类型别名导致ambigous类型类的分辨率阅读器(Scalaz 7

2019-09-21 03:14发布

代码进行测试:

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的情况?

你有关于何时使用类型拉姆达以及何时使用一个类型别名,使一切顺利上没有意外的错误从长远来看指引?

Answer 1:

是的,这是关系到SI-2712。

kleisliIdMonadReader单独存在,以指导类型推断; 它只是转发到kleisliMonadReader 。 通过提供类型别名IntReader ,scalac不需要这种帮助,并能推断出类型参数kleisliMonadReader直接。 这导致歧义。

我只是犯了一个补救措施:我们可以在子类中定义一个这些implicits彼此相对优先级。

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



文章来源: Scalaz 7 - why using type alias results in ambigous typeclass resolution for Reader