2017-04-24 94 views
1

我很好奇方法scalaz.Bind.bind的實施?謝謝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源代碼。

回答

0

Bind遵循類型類型模式,而那些支持由它們定義的操作的不同類型往往有多個實現。該實現稱爲類型類實例。 Scala標準庫類的大部分Scalaz類實例都位於scalaz.std包中。示例:

Bind[List]listInstances隱含值scalaz.std.ListInstaces特徵,在scalaz/std/List.scala中定義。它可以通過scalaz.std.list對象(在同一文件中)或scalaz.Scalaz對象(在斯卡拉/ Scalaz.scala中)導入,兩者都可以擴展ListInstances特徵。

Bind[Option]optionInstances暗示值sclaaz.std.OptionInstances,在scalaz/std/Option.scala中定義。它可以通過scalaz.std.option對象(在同一文件中)或scalaz.Scalaz對象(在斯卡拉/ Scalaz.scala中)導入,兩者都可以擴展OptionInstances特徵。

您還可以通過創建實現一個或多個相應特徵的隱式值或轉換來爲您自己的類型創建Scalaz類型實例。要顯示,必須將implicits導入到您的上下文中。