私はScalaに比較的慣れていません。
「連結」プログラミングを可能にするパターンを開発しようとしています。目標は、メソッドの 1 つから返される可能性のあるエラーをドラッグしながら、Linux の「パイプ」のような方法でデータの操作を左から右に連鎖できるようにすることです。そのため、チェーンの最後にどちらかがあります。
私はそれを単一の演算子に煮詰めることができませんでした-演算子の右側のメソッドに応じて区別する必要があるようです-それがプレーンな結果を返すか、すでにどちらかにラップされている場合。
ここで、これを行う既存のライブラリへの批評/ヒント/ポインタを求めています
ありがとう
type PResult[R] = Either[String, R]
implicit class fromVal[A](val in: A) {
def |>[B](f: A => B): PResult[B] = Right(f(in))
def |>>[B](f: A => PResult[B]): PResult[B] = f(in)
}
implicit class fromEither[A](val in: PResult[A]) {
def |>[B](f: A => B): PResult[B] =
in match {
case Left(l) => Left(l)
case Right(r) => Right(f(r))
}
def |>>[B](f: A => PResult[B]): PResult[B] =
in match {
case Left(l) => Left(l)
case Right(r) => f(r)
}
}
val f1: Int => Int = _ + 2 //> f1 : Int => Int = <function1>
val f2: Int => PResult[Int] = { in => Right(in + 3) }
//> f2 : Int => piper.PResult[Int] = <function1>
22 |>> f2 |> f1 |>> f2 //> res0: piper.PResult[Int] = Right(30)
先物やその他の結果が成功または失敗になる可能性があるものでも、同様のものを使用できると思います。
|>と|>>が map と flatMap に非常に似ていることは確かです。
そして、私がやろうとしていることを for-comprehensions と比較すると - それらはまた均質ではありません -オプションまたは何かでラップされているものには<-を使用しなければならず、 =は単なる計算です。それで、私は何を逃しましたか、何を改善できますか?