1

これらの構造の読み方については、Lang 仕様またはブログの参照をどこで見つけることができますか。

trait GenericFunctor[->>[_, _ ], ->>>[_, _ ], F[_]] { 
  def fmap[A, B](f: A ->> B): F[A] ->>> F[B]
}

また

trait Category[~>[_, _ ]] {
  def compose[A, B, C](f: B ~> C)(g: A ~> B): A ~> C 
  def id[A]: A ~> A 
}

タイプ名の場合 - コード F[A] ->>> F[B]はコンパイル可能であってはなりませんが、

4

1 に答える 1

8
trait GenericFunctor[->>[_, _], ->>>[_, _], F[_]] { 
  def fmap[A, B](f: A ->> B): F[A] ->>> F[B]
}

Scala では、識別子にシンボルを使用できます。記号識別子を英数字のものに置き換えましょう。

trait GenericFunctor[M[_, _], N[_, _], F[_]] { 
  def fmap[A, B](f: A M B): F[A] N F[B]
}

Scala は、バイナリ型コンストラクターに中置型表記法を提供します。つまり、A M Bと同じM[A, B]です。その砂糖なしで上記のコードを書き直しましょう。

trait GenericFunctor[M[_, _], N[_, _], F[_]] { 
  def fmap[A, B](f: M[A, B]): N[F[A], F[B]]
}

同様に、Category質問の定義は次のように書き直すことができます。

trait Category[F[_, _]] {
  def compose[A, B, C](f: F[B, C])(g: F[A, B]): F[A, C]
  def id[A]: F[A, A] 
}

これでクリアですか?

于 2012-06-06T14:03:22.107 に答える