我有一个构造,我们称之为Container。正如您可能猜到的,它是另一个对象的容器,带有一些标题(一个简单的映射)。容器有两个实例,一个成功容器或一个失败的容器。
我在容器上定义了一个函数,名为
flatMap(f: Container[T]=> Container[U]): Container[U]
非常熟悉的正确,除了不像真正的' monad,它来自M [A] - > M [B],而不是A-> M [B]。这是因为我希望映射函数可以访问容器的所有字段。
现在没有真正的问题,除了它没有遵循monad的定义,因此它不适合作为生成器的理解。
除了更改flatMap定义之外的任何建议,或者我只是SoL:)
答案 0 :(得分:7)
如果您从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
。