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 のケースでここで何が起こるか説明できますか?

いつラムダ型を使用し、いつ型エイリアスを使用して、予期しないエラーなしですべてがうまくいくかについてのガイドラインはありますか?

4

1 に答える 1

4

はい、これは SI-2712 に関連しています。

kleisliIdMonadReader型推論を導くためだけに存在します。に転送するだけkleisliMonadReaderです。型 alias を提供することによりIntReader、scalac はこの支援を必要とせず、型引数をkleisliMonadReader直接推測できます。これはあいまいさにつながります。

サブクラスで 1 つを定義することにより、これらの Implicit に相対的な優先順位を付けることができます。

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

于 2012-08-11T09:31:37.627 に答える