3

ジェネリックにネストされた構造型の奇妙な構造を誰かが説明できますか:

implicit def Function1Functor[R]: Functor[({type λ[α]=(R) => α})#λ] = 
  new Functor[({type λ[α]=(R) => α})#λ] ....

この例は Scalaz ライブラリからのものです: Functor.scala

なぜこの構造が必要なのですか?書くのは簡単ではありません:

 implicit def Function1Functor[R,A]: Functor[R =>A]

また

 implicit def Function1Functor[R,A]: Functor[Function1[R,A]]
4

1 に答える 1

7

型コンストラクターのシグネチャは、Functor別の単項型コンストラクターでパラメーター化されていることを示していますF

trait Functor[F[_]] extends InvariantFunctor[F]

型コンストラクタR => Aでもありません。Function1[R,A]パラメータを取りません。

ただし、次の場合:

type λ[α] = (R) => α

λは、1 つのパラメーターを取る型コンストラクターαです。(Rはこのコンテキストで既に定義されています。)

この構文({type λ[α]=(R) => α})#λはラムダ型として知られています。これは、型エイリアスをインラインで作成し、プロジェクションを介して参照できるようにする構文上のトリックであるため、型が必要な場所で式全体を使用できます。

于 2011-11-23T14:24:46.010 に答える