scalaz.Monad
и семейство классов связанных типов, абстрагируют некоторые общие функциональные возможности для широкого спектра типов.Scalaz предоставляет функции общего назначения, которые работают для any Monad
;и вы можете писать свои собственные функции таким же образом.
Без этой абстракции вы будете вынуждены писать эти функции для каждого нового монадического типа, с которым вы встречаетесь, например, List
, Parser
, Option
,Это утомительно!
Вот примеры нескольких предоставленных функций, работающих с парой монадических типов.Мой любимый sequence
:
scala> 1.pure[Option].pure[Option]
res1: Option[Option[Int]] = Some(Some(1))
scala> res1.join
res2: Option[Int] = Some(1)
scala> List(1.some, 2.some).sequence
res3: Option[List[Int]] = Some(List(1, 2))
scala> List(1.some, none[Int]).sequence
res4: Option[List[Int]] = None
scala> List(1.pure[Function0])
res5: List[() => Int] = List(<function0>)
scala> res5.sequence
res6: () => List[Int] = <function0>
scala> res6()
res7: List[Int] = List(1)
scala> true.some ifM(none[Int], 1.some)
res8: Option[Int] = None
scala> false.some ifM(none[Int], 1.some)
res9: Option[Int] = Some(1)