Использование скаляза kleisli без явного переноса функции перед
Допустим, у меня есть две функции val f: A => M[B]
а также val g: B => M[C]
где М монадическая Таким образом, я хочу объединить их, используя kleisli. Что я сейчас делаю, так это: kleisliU(f) andThenK g
Но я не нашел способа выполнить эту комбинацию без предварительной ручной упаковки в kleisli.
Как можно написать что-то вроде f <???> g
чтобы f
автоматически упаковывается в клей и затем объединяется с g
? Я надеюсь, что что-то в scalaz уже существует для этого, и мне не нужно писать собственный неявный класс / преобразование.
Просто для полноты, это должно также работать с большим количеством функций, например f <???> g <???> h
,
1 ответ
Решение
Когда-то я хотел то же самое, и я не нашел его в скалазе, поэтому я просто написал это сам:
implicit def toKleisliK[M[_], A, B]: (A => M[B]) => Kleisli[M, A, B] = f => {
kleisli[M, A, B](a => f(a))
}
// then for example you can write such:
val f: Int => Option[String] = ???
val g: String => Option[Double] = ???
val result = f andThenK g // inferred type is ReaderT[Option, Int, Double]