scala - Scalaz `F[_] : Applicative` 类型约束如何暗示使用隐式参数?

标签 scala typeclass scalaz implicits

我正在努力理解 Traverse 中的以下函数定义Scalaz 中的特性:
def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]]
我不明白的部分是 F[_] : Applicative .

现在,让我们看看 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)
}

在这里,对于 traverse为某种类型工作 F , 需要带一个类型为 Applicative[F] 的隐式对象在适用范围。

我想了解几件事:
  • Wat 确实如此 F[_] : Applicative意思?
  • 为什么F[_]Applicative有关?我们需要Applicative[F] ,不是 F[something] extends Applicative 对吗?
  • 为什么此方法使用类型 Applicative[F] 的隐式值不声明隐式参数?
  • 最佳答案

    我认为这三个问题都可以用这个符号来回答:

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

    相当于:
    def traverse[F[_], A, B](f: A => F[B], t: T[A])(implicit $ev: Applicative[F]): F[T[B]]
    

    第一个符号被称为 context boundF[_] .

    关于scala - Scalaz `F[_] : Applicative` 类型约束如何暗示使用隐式参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7109571/

    相关文章:

    scala - 在 Scala 中正确编码这种存在类型?

    scala - 推断类型以供理解

    java - 在 java 代码中,从 java.util.List 获取 scala.Iterable

    存在类型的 Scala 类型推断

    scala - 无法使用完整的 Set.repartition(1).saveAs Parquet 文件 ("swift://notebooks.spark/tweetsFull.parquet"写入 Parquet 文件

    haskell - 将面向对象的类结构转换为 Haskell

    scala - IntelliJ 反复忘记目标 src_managed 是源目录

    scala - Ad-hoc 多态性 - 类型类

    haskell - 对受约束的 GADT 记录使用记录更新语法

    scala - 找不到用于排序的 Traverse Seq[ValidationNel[String, MyCaseClass]] => ValidationNel[String, Seq[MyCaseClass]]