假设:
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]
如何使用something
而不是Functor
机制使用上下文边界重新编写implicit ev ...
?
答案 0 :(得分:4)
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
顺便说一句,正如另一个答案指出的那样,您似乎错过了F[A]
,这可能是fmap
的第二个参数为???
的原因,您可能想要{要输入x
{1}},您可能希望将F[A]
更改为Functor
,以便拨打Applicative
答案 1 :(得分:-3)
虽然 JavaBean jb = new JavaBean();
jb.setS("abc");
jb.setCount(1);
context.write(key,jb.toString());
的类型是有效的scala类型,但它无人居住,i。即这种类型的函数无法实现,因为没有从给定something
构建F[A]
的一般方法(当然假设你没有"欺骗",即不允许A
,null
和非终止。)
您当然可以使用上下文绑定语法编写类型,即throw
。但是,这不会改变它无人居住的事实,因而不是很有用。