Scala monad与flatMap定义

时间:2014-01-02 21:05:18

标签: scala

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

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

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

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

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

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

1 个答案:

答案 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