The Scalaz import Pattern:
Enrichment methods for typeclasses are located in:
import scalaz.syntax.{typeclass}._
Enrichment for standard libs are located in:
import scalaz.syntax.std.{std-class}._
Typeclasses for std library classes are usually located in:
import scalaz.std.{std-class}._
Id
import scalaz.Id.Id
val string: Id[String] = "adsf"
Equals
In order to use ===
, you need the equals syntax, and an Equal[A]
instance, where A
is the type you're comparing.
import scalaz.syntax.equal._ // for ===
import scalaz.std.string._ // for Equal[String]
"foo" === "bar"
If you're comparing a generic type, such as Option
, you'll need an instance of Equal[Option[A]]
. The implicit Option equals build can make this easy if you have an instance of Equal[A]
.
import scalaz.syntax.equal._ // for ===
import scalaz.std.string._ // for Equal[String]
import scalaz.std.option._ // for optionEqual[A]
Option("foo") === Option("bar")
Disjunction
import scalaz.syntax.either._
1.right
"Error".left
Semigroup
for |+|
, you need the semigroup syntax, and a Semigroup[A]
, where A
is the type you're adding.
import scalaz.syntax.semigroup._ // for |+|
import scalaz.std.string._ // for Semigroup[String]
"foo" |+| "bar"
Traverse
For .traverse
, you need the traverse
syntax, a Traverse[F]
, where F
is the collection type, and an Applicative[G]
, where G
is the type you're traversing into.
import scalaz.syntax.traverse._ // for .traverse
import scalaz.std.list._ // for Traverse[List]
import scalaz.std.option._ // for Applicative[Option]
List(1, 2, 3).traverse {
a => Option(a)
}
Suml
For .suml
, you need the foldable
syntax, a Foldable[F]
where F
is the type of the collection you're squashing, and a Monoid[A]
, where A
is the type inside your foldable.
import scalaz.syntax.foldable._ // for .suml
import scalaz.std.list._ // for Foldable[List]
import scalaz.std.string._ // for Monoid[String]
List("foo", "bar", "baz").suml // "foobarbaz"
import scalaz.std.option._ // for Monoid[Option]
List(Some("foo"), None, Some("baz")).suml // Some("foobaz")