我正在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),并且仍然可以使用相同的代码。
答案 0 :(得分:1)
错误:Error in: error: could not find implicit value for evidence parameter of type Numeric[Any]
。 !!
的定义:
def !! (msg: Any): Future[Any]
T
得到的Arithmetic
是Any
。确实没有Numeric[Any]
。
答案 1 :(得分:0)
我很确定不你的问题。首先,A
和B
是函数,函数没有+
或*
。如果您拨打了A()
和B()
,那么您可能会有机会......除非他们是java.lang.Number
,也没有{ {1}}或+
(或您希望它拥有的任何其他方法)。
基本上,没有“数字”类型是所有数字的超类或接口,原因很简单,Java没有它。 Stack Overflow上有很多关于这个主题的问题,包括我自己关于Scala的第一个问题 - 调查*
,这是目前最好的近似值。
方法和功能是不同的东西 - 在这里看到大量相关问题,关于删除括号的规则也是不同的。我会让REPL为我说话:
scala.math.Numeric