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 回答