如何在 Scala 中通过 'andThen' 组合 Function1 类型的 monadic functions/methods?
How to compose monadic functions/methods of type Function1 via 'andThen' in Scala?
我正在尝试将 f: a -> Either[_,b]
类型的函数相互组合,但似乎没有任何效果。我尝试使用如下所示的隐式扩展 Function1
但不断出现编译错误:
import scala.language.implicitConversions
object MyExtensions {
implicit class AndThenEither[A,B](val e: Function1[A,Either[_,B]]) {
def andThen[C](f:Function1[B, Either[_,C]]): Function1[A, Either[_,C]] = {
(v1: A) => e.apply(v1).flatMap(b => f.apply(b)) //type: A => Either[_,C]
}
}
}
但是以下失败了:
object Sample extends App {
case class TenX(t: Int)
case class DoubleX(x: Int)
def composeFunction1Test(): Unit = {
val func1: (Int) => Either[String, TenX] = (i: Int) => Right(TenX(10 * i))
val func2: (TenX) => Either[String, DoubleX] = (t: TenX) => Right(DoubleX(t.t * 2))
val pipeline = func1 andThen func2
val result = pipeline(1); //Expected Right(DoubleX(20))
}
}
这一直在抱怨类型不匹配,我不知道出了什么问题。另外,如果我尝试将它与 def
定义的方法一起使用(而不是像上面那样 val
),它仍然无法编译。
问题: 我怎样才能将这样的 Either
类型的函数与等效的 andThen
operator/function 组合起来,以便在任何这样的函数中使用,或者class 允许这种链接的方法?
由于 andThen
已在 Function1
上定义,因此隐式解析将不会启动以解析同名的扩展方法。尝试重命名扩展方法
implicit class AndThenEither ... {
def fooAndThen ...
}
func1 fooAndThen func2 // should work
Kleisli 确实是一种组合返回 monadic 值的函数的方法。
我正在尝试将 f: a -> Either[_,b]
类型的函数相互组合,但似乎没有任何效果。我尝试使用如下所示的隐式扩展 Function1
但不断出现编译错误:
import scala.language.implicitConversions
object MyExtensions {
implicit class AndThenEither[A,B](val e: Function1[A,Either[_,B]]) {
def andThen[C](f:Function1[B, Either[_,C]]): Function1[A, Either[_,C]] = {
(v1: A) => e.apply(v1).flatMap(b => f.apply(b)) //type: A => Either[_,C]
}
}
}
但是以下失败了:
object Sample extends App {
case class TenX(t: Int)
case class DoubleX(x: Int)
def composeFunction1Test(): Unit = {
val func1: (Int) => Either[String, TenX] = (i: Int) => Right(TenX(10 * i))
val func2: (TenX) => Either[String, DoubleX] = (t: TenX) => Right(DoubleX(t.t * 2))
val pipeline = func1 andThen func2
val result = pipeline(1); //Expected Right(DoubleX(20))
}
}
这一直在抱怨类型不匹配,我不知道出了什么问题。另外,如果我尝试将它与 def
定义的方法一起使用(而不是像上面那样 val
),它仍然无法编译。
问题: 我怎样才能将这样的 Either
类型的函数与等效的 andThen
operator/function 组合起来,以便在任何这样的函数中使用,或者class 允许这种链接的方法?
由于 andThen
已在 Function1
上定义,因此隐式解析将不会启动以解析同名的扩展方法。尝试重命名扩展方法
implicit class AndThenEither ... {
def fooAndThen ...
}
func1 fooAndThen func2 // should work
Kleisli 确实是一种组合返回 monadic 值的函数的方法。