3

我目前正在玩 Scalaz 非阻塞期货。承诺。我正在努力使以下函数尾递归:

@tailrec
private def repeat( res: Promise[I] ):Promise[I] =
  res map p flatMap { 
    (b:Boolean) =>
      if( b ) repeat( res flatMap f ) else res
  }

wherep是一个带有 type 的谓词,是一个带有 typeI=>Booleanf并发函数I=>Promise[I]

该方法在没有注释的情况下编译。

有什么提示吗?谢谢

4

2 回答 2

4

您的方法根本不是递归的。res是可能在另一个线程中运行的计算。res map p flatMap f就您的方法而言,将立即返回一个承诺。重复repeat将发生在不同的过程中。

用更简洁的术语来说,Promise是一个 continuation monad,flatMap调用会自动为您转换为 continuation-passing 风格。

于 2011-05-10T04:22:25.050 回答
1

虽然这看起来是尾递归,因为调用在代码中只出现一次,但您有不止一个递归调用 - 一个用于集合中的每个元素。至少这是编译器看到的。(假设这是某个集合上的 flatMap;我不知道p会返回什么)

您将递归作为匿名函数传递到某处。没有人知道它会多久执行一次。

于 2011-05-09T13:57:32.190 回答