繁体   English   中英

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

[英]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] (当然,假设您没有“作弊”,即nullthrow和non-termination不允许)。

您当然可以使用上下文绑定的语法来编写类型,这将是def something[A, B, F[_]: Functor](f: A => B, x: A) 但是,这不会改变它无人居住,因此不是很有用的事实。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM