2

我正在尝试创建一个具有选项管道的 Scala Actor。我希望能够向这个actor发送选项消息,然后它会继续调用选项管道并对结果做一些事情。如果这样的东西已经存在,你知道我在哪里可以找到它吗?

请在下面找到我的代码以及我遇到的奇怪编译错误:

“SBT 构建器在编译您的项目时崩溃。这是 Scala 编译器或 SBT 中的错误。请查看错误日志了解详细信息。错误消息为:null”

MonadChainActor.scala

import scala.actors.Actor

class MonadChainActor[T](monadChain: Option[T]=>Option[T]) extends Actor {

  case class OptionMessage(o:Option[T])

  def act() {
    while(true){
      receive {
        case OptionMessage(o) => println(monadChain(o).get)
      }
    }
  }

}

Main.scala

def monadIntChain(a:Option[Int]):Option[Int] = 
  a.map(x => x+1).map(x => x+1).map(x => x+1)

object Main {
  def main(args: Array[String]): Unit = {
    var a = new MonadChainActor(monadIntChain)
    a ! a.OptionMessage(Some(1))  
  }
}
4

1 回答 1

1

看起来您在 scala 编译器中发现了一个错误。我注意到,如果您不使用 path-dependent type OptionMessage,它可以工作(我还添加了一条Stop消息):

import scala.actors.Actor

class MonadChainActor[T](monadChain: Option[T]=>Option[T]) extends Actor {
  case object Stop
  def act() {
    while (true) {
      receive {
        case o: Option[T] => println(monadChain(o).get)
        case Stop => exit()
      }
    }
  }
}

object Main {
  def monadIntChain(a:Option[Int]):Option[Int] = 
    a.map(x => x+1).map(x => x+1).map(x => x+1)
  def main(args: Array[String]): Unit = {
    var a = new MonadChainActor(monadIntChain)
    a.start
    a ! Some(3)  
    a ! a.Stop
  }
}

或者你可以在演员之外声明它(我Stop在外面声明只是为了保持一致):

import scala.actors.Actor

case class OptionMessage[T](o:Option[T])
case object Stop

class MonadChainActor[T](monadChain: Option[T]=>Option[T]) extends Actor {
  def act() {
    while (true) {
      receive {
        case om : OptionMessage[T] => println(monadChain(om.o).get)
        case Stop => exit()
      }
    }
  }
}

object Main {
  def monadIntChain(a:Option[Int]):Option[Int] = 
    a.map(x => x+1).map(x => x+1).map(x => x+1)
  def main(args: Array[String]): Unit = {
    var a = new MonadChainActor(monadIntChain)
    a.start
    a ! OptionMessage(Some(3))  
    a ! Stop
  }
}
于 2012-06-17T22:44:28.923 回答