我有一个构造,我们称之为容器。正如您可能猜到的那样,它是另一个对象的容器,带有一些标头(一个简单的映射)。容器有两个实例:成功容器或失败容器。
我在容器上定义了一个函数,称为
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
。