首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scalaz `F[_]:Applicative`约束是如何暗示使用隐式参数的?

Scalaz `F[_]:Applicative`约束是如何暗示使用隐式参数的?
EN

Stack Overflow用户
提问于 2011-08-18 14:59:09
回答 1查看 337关注 0票数 5

我很难理解Scalaz中Traverse特性中的以下函数定义:

def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]]

我不明白的部分是F[_] : Applicative

现在,让我们看看Applicative是什么:

代码语言:javascript
复制
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)
}

在这里,要使traverse用于某些类型的F,需要在作用域中引入Applicative[F]类型的隐式对象。

我想了解几件事:

  1. Wat F[_] : Applicative的确切意思是?
  2. F[_]为什么与Applicative有关?我们需要Applicative[F],而不是Fsomething扩展应用程序对吗?
  3. 为什么该方法使用Applicative[F]类型的隐式值而不声明隐式参数?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-18 15:01:57

我认为这三个问题都可以用这个表示法来回答:

代码语言:javascript
复制
def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]]

相当于:

代码语言:javascript
复制
def traverse[F[_], A, B](f: A => F[B], t: T[A])(implicit $ev: Applicative[F]): F[T[B]]

第一种表示法称为 for F[_]

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7109571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档