Использование скаляза 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]
Другие вопросы по тегам