2

Option パイプラインを持つ Scala アクターを作成しようとしています。このアクターにオプション メッセージを送信できるようにしたいと考えています。これにより、オプション パイプラインが呼び出され、結果に対して何らかの処理が行われます。このようなものがすでに存在する場合、どこで見つけられるか知っていますか?

私が得ている奇妙なコンパイルエラーとともに、以下の私のコードを見つけてください:

「プロジェクトのコンパイル中に 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 に答える