この質問はScalaの暗黙の解決システムの制限についてのもので、私がScalazを使用するときに数回実行したものであり、それは私にはあまり意味がありません。私は以下のScalaz-lessバージョンに問題を掘り下げましたが、必要に応じて動機付けに関する詳細情報を提供しています。タイプエイリアスとタイプlambdaの区別
は、私はその証人型コンストラクタについて何かを型クラスのカップルを持っていると仮定します。
import scala.language.higherKinds
trait Foo[F[_]]
trait Bar[F[_], A]
今も私はいくつかF
ためFoo
インスタンスを持っている場合、私はまたのためにFoo
インスタンスを持って知っていると仮定しますBar[F, _]
:
implicit def barFoo[F[_]: Foo] = new Foo[({type L[X] = Bar[F, X]})#L] {}
私はList
とEither
の右側のインスタンスをも持っている:
implicit object listFoo extends Foo[List]
implicit def eitherFoo[A] = new Foo[({type L[X] = Either[A, X]})#L] {}
が今では、私は次のように記述することができるはずということはかなり明らかだ:
type BarList[X] = Bar[List, X]
implicitly[Foo[BarList]]
または、同等:
implicitly[Foo[({type L[X] = Bar[List, X]})#L]]
そして実際、両方が期待どおりに動作します。
だから私は、次のことを試してくださいません:
type StringOr[X] = Either[String, X]
type BarStringOr[X] = Bar[StringOr, X]
そして:
再びscala> implicitly[Foo[BarStringOr]]
res2: Foo[BarStringOr] = [email protected]
、ここには驚き。しかし、私は試してみてください。
implicitly[Foo[({type L[X] = Bar[StringOr, X]})#L]]
そして、私は、次を得る:私は目的のインスタンスを取得するには何の問題StringOr
のために必要なFoo
インスタンスを推論する、または明示的にbarFoo
を呼び出しを持っていない
<console>:15: error: could not find implicit value for parameter e: Foo[[X]Bar[[X]scala.util.Either[String,X],X]]
implicitly[Foo[({type L[X] = Bar[StringOr, X]})#L]]
^
注:
scala> implicitly[Foo[StringOr]]
res4: Foo[StringOr] = [email protected]
scala> barFoo[StringOr]
res5: Foo[[X]Bar[StringOr,X]] = [email protected]
の重要な違いを特定することができませんとStringOr
のケースでは、ラムダ型のバージョンは前者では動作しますが後者では動作しません。
私はScala 2.10.0-RC5と2.9.2でこれを試しました。全体に共分散を加えることは役に立たない。
明らかなものがありませんか?誰かが私にこのことを理解させるのに役立つ仕様や、これまでの同様の問題の議論に私を指摘できますか?
このトピックについてはわかりませんが、https://issues.scala-lang.org/browse/SI-2712との関係があります。 – aemxdp
@andriyp:ありがとうございます。私はそれがどのように関連しているのか確かめています –
トラビスはhttps://issues.scala-lang.org/browse/SI-6895でもチケットを開設しました –