如何在 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 值的函数的方法。