Предположим, у меня есть несколько функций Int => Int
, составленных из andThen
:
val f1: Int => Int = _ + 1
val f2: Int => Int = _ + 2
val f3: Int => Int = _ + 3
val f = f1 andThen f2 andThen f3
Теперь мне нужно вернуть и промежуточные результаты. Поэтому я могу преобразовать все эти функции в Int => (List[Int], Int)
, где список содержит аргументы.
Я, вероятно, могу использовать Writer[List[Int], Int]
из scalaz
для представления пары (List[Int], Int)
:
val fw1: Int => Writer[List[Int], Int] = x => f1(x).set(List(x))
val fw2: Int => Writer[List[Int], Int] = x => f2(x).set(List(x))
val fw3: Int => Writer[List[Int], Int] = x => f3(x).set(List(x))
Чтобы составить fw1
, fw2
и fw3
, мне, вероятно, нужно обернуть их Kleisli
. Однако Kleisli(fw1)
не компилируется, поскольку Writer[List[Int], Int]
не монада.
Я предполагаю, что мне, вероятно, понадобится monad transformer
, чтобы сделать Writer[List[Int], Int]
монаду, но я точно не знаю, как это сделать. Итак, мой вопрос: как заставить Kleisli(fw1)
компилироваться с преобразователем монад?