Предположим, у меня есть такие функции, как это:Сочинение Клейсли и чтения монада в Scala
val fooXAB: X => A => Try[B] = ...
val fooXBC: X => B => Try[C] = ...
val fooXCD: X => C => Try[D] = ...
Я хотел бы, чтобы составить их, чтобы сделать новую функцию fooXAD: X => A => Try[D]
, которая вызывает fooXAB
fooXBC
, и fooXCD
последовательно и передать X
аргумент для всех из них.
Предположим, я использую scalaz
и имею экземпляр монады для scala.util.Try
. Теперь я могу это сделать так:
type AB = Kleisli[Try, A, B]
type BC = Kleilsi[Try, B, C]
type CD = Kleisli[Try, C, D]
type XReader[T] = Reader[X, T]
val fooXAB: XReader[AB] = ...
val fooXBC: XReader[BC] = ...
val fooXCD: XReader[CD] = ...
val fooXAC: XReader[AC] =
for {
ab <- fooXAB
bc <- fooXBC
cd <- fooXCD
} yield (ab andThen bc andThen cd)
Имеет ли смысл? Можно ли это упростить?
Возможно, вы правы ... Теперь мне интересно, когда «читатель» монада _does_ действительно помогает. – Michael