モナドトランスフォーマー (1)

ListとList[Option]とOptionの共存

val intList: List[Int] = List(1, 2, 3, 5)
val strOptList: List[Option[String]] = List(Some("a"), Some("c"), None, Some("d"))
val option: Option[Int] = Option(1)

val t: OptionT[List, (Int, String, Int)] = for {
  i <- OptionT.liftF(intList)
  s <- OptionT(strOptList)
  o <- OptionT.fromOption[List](option)
} yield (i, s, o)

// List(Some((1,a,1)), Some((1,c,1)), None, Some((1,d,1)), Some((2,a,1)), Some((2,c,1)), None, Some((2,d,1)), Some((3,a,1)), Some((3,c,1)), None, Some((3,d,1)), Some((5,a,1)), Some((5,c,1)), None, Some((5,d,1)))
println(t.value)