使用更高键型的上下文绑定?

时间:2016-01-30 19:55:38

标签: scala

假设:

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 ...

2 个答案:

答案 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]的一般方法(当然假设你没有"欺骗",即不允许Anull和非终止。)

您当然可以使用上下文绑定语法编写类型,即throw。但是,这不会改变它无人居住的事实,因而不是很有用。