我正在努力理解
Scalaz中
Traverse
trait中的以下函数定义:
def traverse [F [_]:applicative,A,B](f:A => F [B],t:T [A]):F [T [B]]
我不理解的部分是F [_]:适用.
现在,让我们看看Applicative
是什么:
trait applicative[Z[_]] extends Pointed[Z] with Apply[Z] { override def fmap[A,B](fa: Z[A],f: A => B): Z[B] = this(pure(f),fa) override def apply[A,B](f: Z[A => B],a: Z[A]): Z[B] = liftA2(f,a,(_:A => B)(_: A)) def liftA2[A,B,C](a: Z[A],b: Z[B],f: (A,B) => C): Z[C] = apply(fmap(a,f.curried),b) }
这里,对于某些类型F的遍历工作,需要在范围内引入applicative [F]类型的隐式对象.
我想了解几件事:
> Wat确切地说F [_]:应用意味着什么?
>为什么F [_]与applicative有关?我们需要applicative [F],而不是F [something]扩展applicative对吧?
>为什么此方法使用applicative [F]类型的隐式值而不声明隐式参数?
解决方法
我认为所有这三个问题都可以用这个表示法来回答:
def traverse[F[_] : applicative,B](f: A => F[B],t: T[A]): F[T[B]]
相当于:
def traverse[F[_],t: T[A])(implicit $ev: applicative[F]): F[T[B]]
第一种表示法称为F [_]的context bound.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。