如何在自定义类

时间:2015-10-23 15:21:53

标签: scala

我有一个名为Expect的类,在实例化之后,您可以构建一个数据结构(为简单起见,可以说它是一棵树)。然后调用遍历树的run方法,在每个节点上执行某些操作。这些操作需要一些时间才能完成,因此将来会返回最终结果。在伪代码中,它将类似于:

class Expect[R](command: String) {
  //some methods to build the tree

  def run()(implicit ec: ExecutionContext): Future[R] = {
    //Traverse the tree and execute actions on the nodes that eventually return a R
  }
}

我想用他们常用的签名实现map和flatmap,但是他们作为参数接收的函数必须对将来返回的值进行操作。我看不出任何实现这一点的方法。

def map[T](f: R => T): Expect[T]
def flatMap[T](f: R => Expect[T]): Expect[T]

1 个答案:

答案 0 :(得分:5)

以下类型引导我:

import scala.concurrent.{ExecutionContext, Future}

abstract class Expect[R](command: String) { self => 
  //some methods to build the tree

  def run(implicit ec: ExecutionContext): Future[R]

  def map[T](f: R => T): Expect[T] = new Expect[T](command) {
    def run(implicit ec: ExecutionContext): Future[T] =
      self.run.map(f)
  }

  def flatMap[T](f: R => Expect[T]): Expect[T] = new Expect[T](command) {
    def run(implicit ec: ExecutionContext): Future[T] =
      self.run.flatMap(r => f(r).run)
  }
}

我认为command可能不属于构造函数,它可能只需要通过实际使用command字符串的结构细化来关闭