Использование scalaz kleisli без явного переноса функции перед

Допустим, у меня есть две функции val f: A => M[B] и val g: B => M[C], где M — монадический. Таким образом, я хочу объединить их, используя kleisli. В настоящее время я делаю следующее: kleisliU(f) andThenK g Но я не нашел способа выполнить эту комбинацию без предварительного ручного переноса в kleisli.

Как можно написать что-то вроде f <???> g, чтобы f автоматически заворачивалось в клейсли, а потом объединялось с g? Я надеюсь, что что-то в scalaz для этого уже существует и что мне не нужно писать свой собственный неявный класс/преобразование.

Просто для полноты, это также должно работать с большим количеством функций, например. f <???> g <???> h.


person valenterry    schedule 05.09.2016    source источник


Ответы (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]
person I See Voices    schedule 05.09.2016