Scala 使用具有更高种类类型的上下文绑定?

Scala 使用具有更高种类类型的上下文绑定?,scala,Scala,鉴于: 然后是something函数: scala> trait Functor[F[_]] { def fmap[A, B](f: A => B, func: F[A]): F[B] } 如何使用函子的上下文边界而不是隐式ev…机制重新编写内容 scala> def something[A, B, F[_]](f: A => B, x: A) (implicit ev: Functor[F]): F

鉴于:

然后是
something
函数:

scala> trait Functor[F[_]] { 
  def fmap[A, B](f: A => B, func: F[A]): F[B]
}
如何使用
函子
的上下文边界而不是
隐式ev…
机制重新编写
内容

scala> def something[A, B, F[_]](f: A => B, x: A)
                                (implicit ev: Functor[F]): F[B] = 
     |   ev.fmap(f, ???)
something: [A, B, F[_]](f: A => B, x: A)(implicit ev: Functor[F])F[B]
可以重写为:

def something[A, B, F[_]](f: A => B, x: A)
                          (implicit ev: Functor[F]): F[B] = 
    ev.fmap(f, ???)
这是使用Predef的隐式方法,该方法只要求隐式参数并返回它:

def something[A, B, F[_]: Functor](f: A => B, x: A): F[B] = 
    implicitly[Functor[F]].fmap(f, ???)
另一方面,正如另一个答案所指出的,您似乎缺少了一个
F[A]
,这可能就是
fmap
的第二个参数是
,您可能希望键入
x
F[A]
,也许您想将
Functor
更改为
Applicative
,以便可以调用
ev.fmap(f,ev.point(x))

可以重写为:

def something[A, B, F[_]](f: A => B, x: A)
                          (implicit ev: Functor[F]): F[B] = 
    ev.fmap(f, ???)
这是使用Predef的隐式方法,该方法只要求隐式参数并返回它:

def something[A, B, F[_]: Functor](f: A => B, x: A): F[B] = 
    implicitly[Functor[F]].fmap(f, ???)

另一方面,正如另一个答案所指出的,您似乎缺少了一个
F[A]
,这可能就是
fmap
的第二个参数是
,您可能希望键入
x
F[A]
,也许您想将
Functor
更改为
Applicative
,这样您就可以调用
ev.fmap(f,ev.point(x))

谢谢,斯图。此外,我还看到了
cats
(不记得在哪里)中的代码,看起来像:
def something[F:HigherKindedType[F]]…
。换句话说,更高种类的类型将自身作为类型参数。你能解释一下这个代码在做什么吗(也许还有到cats代码的链接)?谢谢我不认为这是合法的scala,不知道你指的是什么。谢谢,斯图。此外,我还看到了
cats
(不记得在哪里)中的代码,看起来像:
def something[F:HigherKindedType[F]]…
。换句话说,更高种类的类型将自身作为类型参数。你能解释一下这个代码在做什么吗(也许还有到cats代码的链接)?谢谢我不认为这是合法的scala,不知道你指的是什么。