在Scala的Actors中传递函数并对其结果进行操作

时间:2011-10-12 18:03:17

标签: function generics scala parameters actor

我正在scala中实现一个基于actor的应用程序,我试图能够在actor之间传递函数,只有当actor接收到某些消息时才能处理它们。

import actors.Actor
import java.util.Random

import scala.Numeric._
import Implicits._

class Constant(val n:Number) extends Actor{
    def act(){
        loop{
            receive{
                case "value" => reply( {n} )
            }
        }
    }
}

class Arithmetic[T: Numeric](A: ()=>T, B: ()=>T) extends Actor{
  def act(){
    receive{
      case "sum" => reply ( A() + B() )

    /*  case "mul" => reply ( A * B )
    */
    }
  }
}

object Main extends App{
    val c5 = new Constant(5)
    c5.start


    val a = new Arithmetic({c5 !! "value"}, {c5!!"value"} )
  a.start

  println(a!?"sum")
  println(a!?"mul")

}

在上面的示例代码中,我希望输出为5 + 5和5 * 5。问题是答复不是类型化的函数,因此我无法让运算符(+,*)对A和B的结果进行操作。

您能否就如何更好地设计/实施此类系统提供任何帮助?

修改:更新代码以更好地反映问题。错误: 错误:无法找到Numeric [Any]类型的证据参数的隐含值 val a = new Arithmetic({c5 !!“value”},{c5 !!“value”})

每当我调用它时,我都需要能够在actor中传递要评估的函数。此示例使用静态值,但我将来会使用动态值,因此,传递该值将无法解决问题。此外,我希望收到不同的var类型(Int / Long / Double),并且仍然可以使用相同的代码。

2 个答案:

答案 0 :(得分:1)

错误:Error in: error: could not find implicit value for evidence parameter of type Numeric[Any]!!的定义:

def !! (msg: Any): Future[Any]

T得到的ArithmeticAny。确实没有Numeric[Any]

答案 1 :(得分:0)

我很确定你的问题。首先,AB是函数,函数没有+*。如果您拨打了A()B(),那么您可能会有机会......除非他们是java.lang.Number没有{ {1}}或+(或您希望它拥有的任何其他方法)。

基本上,没有“数字”类型是所有数字的超类或接口,原因很简单,Java没有它。 Stack Overflow上有很多关于这个主题的问题,包括我自己关于Scala的第一个问题 - 调查*,这是目前最好的近似值。

Method vs Function且缺少括号

方法和功能是不同的东西 - 在这里看到大量相关问题,关于删除括号的规则也是不同的。我会让REPL为我说话:

scala.math.Numeric