1

我很好奇该方法在哪里scalaz.Bind.bind实现?谢谢

trait Bind[F[_]] extends Apply[F] { self =>
  ////

  /** Equivalent to `join(map(fa)(f))`. */
  def bind[A, B](fa: F[A])(f: A => F[B]): F[B]
  ...

我正在查看 7.3.0-SNAPSHOT 源。

4

1 回答 1

0

Bind遵循类型类模式,并且那些往往具有支持由它们定义的操作的不同类型的多个实现。该实现称为类型类实例。Scala 标准库类的大多数 Scalaz 类型类实例都位于scalaz.std包中。例子:

Bind[List]: trait 中的listInstances隐含值scalaz.std.ListInstaces,在 scalaz/std/List.scala 中定义。它可以通过scalaz.std.list对象(在同一个文件中)或scalaz.Scalaz对象(在 scalaz/Scalaz.scala 中)导入,这两者都扩展了ListInstancestrait。

Bind[Option]:optionInstances中的隐含值sclaaz.std.OptionInstances,在 scalaz/std/Option.scala 中定义。它可以通过scalaz.std.option对象(在同一个文件中)或scalaz.Scalaz 对象(在 scalaz/Scalaz.scala 中)导入,这两者都扩展了OptionInstancestrait。

您还可以通过创建实现一个或多个相应特征的隐式值或转换来为您自己的类型创建 Scalaz 类型类实例。为了可见,implicits 必须被导入到你的上下文中。

于 2017-04-28T13:32:16.303 回答