2016-09-05 2 views
2

私は2つの関数val f: A => M[B]val g: B => M[C]を持っているとしましょう。ここでMはモナドです。だから私はkleisliを使ってそれらを組み合わせたいと思う。 私が現在行っていることは次のとおりです:kleisliU(f) andThenK g しかし、私は最初にkleisliに手作業でラップせずにこの組み合わせを実行する方法を見つけられませんでした。明示的に関数をラップすることなくscalaz kleisliを使用する

f <???> gのように書くと、fは自動的にkleisliにラップされ、gと組み合わされますか?私はscalazの何かがそれのために既に存在し、私自身の暗黙のクラス/変換を書く必要がないことを願っています。

完全性のために、これはもっと多くの機能、 f <???> g <???> h

答えて

1

私は同じことを望んでいたと私はscalazでそれを見つけることができませんでしたので、私はちょうどそれを自分で書いたら:

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] 
関連する問題