我在哪里可以找到Lang规范或任何博客中的参考如何阅读这些结构:
trait GenericFunctor[->>[_, _ ], ->>>[_, _ ], F[_]] {
def fmap[A, B](f: A ->> B): F[A] ->>> F[B]
}
Run Code Online (Sandbox Code Playgroud)
要么
trait Category[~>[_, _ ]] {
def compose[A, B, C](f: B ~> C)(g: A ~> B): A ~> C
def id[A]: A ~> A
}
Run Code Online (Sandbox Code Playgroud)
如果它是一个类型名称 - 那么代码 F[A] ->>> F[B]不应该是可编译的,但它是
trait GenericFunctor[->>[_, _], ->>>[_, _], F[_]] {
def fmap[A, B](f: A ->> B): F[A] ->>> F[B]
}
Run Code Online (Sandbox Code Playgroud)
Scala允许标识符中的符号.让我们用字母数字代码替换符号标识符.
trait GenericFunctor[M[_, _], N[_, _], F[_]] {
def fmap[A, B](f: A M B): F[A] N F[B]
}
Run Code Online (Sandbox Code Playgroud)
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]]
}
Run Code Online (Sandbox Code Playgroud)
同样,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]
}
Run Code Online (Sandbox Code Playgroud)
现在清楚了吗?
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |