2012-06-06 77 views
1

我在哪里可以找到郎说明书或引用任何博客如何看这些建筑:参考文档 - >>> [_,_]和〜>

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]不应该是编译的,但它是

回答

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

斯卡拉允许符号identi fiers。我们用符号标识符替换字母数字标识符。

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

Scala为二进制类型构造函数提供中缀类型符号。换句话说,A M BM[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] 
} 

是否清楚了吗?

+1

+1我在学习Ocaml时不得不一直这样做。像斯卡拉这样的语言有太多可笑的句法糖(这不是一件坏事,但却让人难以学习)。 –