MonadTransformer
#cats
概要
モナドの合成方法
作用(コンテキスト)を積んでいくと、中の値にアクセスするためにflatMapを重ねて作用を剥がしていかなければいけない
code:scala
def lookupUserName(id: Long): Either[Error, OptionString] =
for {
optUser <- lookupUser(id)
} yield {
for { user <- optUser } yield user.name
}
モナドは一般的に合成可能ではない→flatMapが実装できないことに気づく
内側のモナドがトランスフォーマーになる
処理の返り値としてMonadTを用いるとユーザーにTransformerのインタフェースを強要することになってしまう
→処理の中ではOptionT[List, A]とかを使って返り値ではList[Option[A]]にする方が使いやすい
例
List[Option[A]]
→OptionT[List, A]
type ListOption[A] = OptionT[List, A]
catsのモナドトランスフォーマー
OptionT
EitherT
ReaderT
WriterT
StateT
IdT