[英]Using Context Bound with Higher Kinded Type?
鉴于:
scala> trait Functor[F[_]] {
def fmap[A, B](f: A => B, func: F[A]): F[B]
}
然后是something
函数:
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]
我该如何使用Functor
上下文边界而不是implicit ev ...
机制来重新编写something
?
def something[A, B, F[_]](f: A => B, x: A)
(implicit ev: Functor[F]): F[B] =
ev.fmap(f, ???)
可以重写为:
def something[A, B, F[_]: Functor](f: A => B, x: A): F[B] =
implicitly[Functor[F]].fmap(f, ???)
这使用的是Predef的隐式方法,该方法仅要求一个隐式参数并将其返回:
def implicitly[A](implicit a: A): A = a
fmap
,正如其他答案指出的那样,您似乎缺少F[A]
,这也许就是为什么fmap
的第二个参数是???
,您可能希望x
键入F[A]
,或者您想将Functor
更改为Applicative
以便可以调用ev.fmap(f, ev.point(x))
尽管something
的类型是有效的scala类型,但它是无人居住的,即该类型的函数无法实现,因为没有通用的方法可以从给定的A
构造F[A]
(当然,假设您没有“作弊”,即null
, throw
和non-termination不允许)。
您当然可以使用上下文绑定的语法来编写类型,这将是def something[A, B, F[_]: Functor](f: A => B, x: A)
。 但是,这不会改变它无人居住,因此不是很有用的事实。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.