Scala monad with flatMap definition



我有一个构造,我们称之为容器。正如您可能猜到的那样,它是另一个对象的容器,带有一些标头(一个简单的映射)。容器有两个实例:成功容器或失败容器。

我在容器上定义了一个函数,称为

flatMap(f: Container[T]=> Container[U]): Container[U]

很熟悉,除了不像"真正的"monad,它来自M[A]->M[B],而不是A->M[B]。这是因为我希望映射函数能够访问容器的所有字段。

现在这没有真正的问题,除了它不遵循 monad 的定义,因此它不适用于作为生成器的理解。

除了更改flatMap定义之外的任何建议,或者我只是SoL:)

如果你要从M[A]M[B],那么你想要的就是map

class Container[A](stuff: A){
  def map[B](f: A => B): Container[B] = new Container(f(stuff))
}

该函数flatMap实际上是为了使A => M[B]类型的函数能够在一种M[A]上工作。因此

 class Container[A](stuff: A){
   def map[B](f: A => B): Container[B] = new Container(f(stuff))
   def flatMap[B](f: A => Contains[B]): Container[B] = f(stuff)
 }

所以你的定义中真的根本不需要flatMap

最新更新