我正在尝试创建一个具有Option管道的Scala Actor。我希望能够向此actor发送Option消息,然后继续调用选项管道并对结果执行某些操作。如果这样的事情已经存在,你知道我在哪里找到它吗?
请在下面找到我的代码以及我得到的奇怪的编译错误:
“SBT构建器在编译项目时崩溃。这是Scala编译器或SBT中的错误。请查看Erorr日志以获取详细信息。错误消息为: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))
}
}
答案 0 :(得分:1)
看起来您在scala编译器中发现了一个错误。我注意到如果你不使用路径依赖类型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
}
}