【问题标题】:Passing functions and operating on their results within Scala's Actors在 Scala 的 Actor 中传递函数并对其结果进行操作
【发布时间】:2011-10-13 06:51:49
【问题描述】:

我正在 scala 中实现一个基于演员的应用程序,并且我试图能够在演员之间传递函数,以便仅在演员收到某些消息时才对其进行处理。

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 的结果进行操作。

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

编辑:更新代码以更好地反映问题。错误: 错误:找不到数值类型的证据参数的隐式值[Any] val a = new Arithmetic({c5 !! "value"}, {c5!!"value"} )

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

【问题讨论】:

    标签: function generics scala parameters actor


    【解决方案1】:

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

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

    所以Arithmetic 得到的TAny。确实没有Numeric[Any]

    【讨论】:

    • 我理解错误。我不明白如何重构代码以便能够做我想做的事。任何提示将不胜感激。
    • @tiagoboldt 嗯,首先,Numeric 必须在整个链中传递——这意味着Constant 必须接收它,并在回复中传递它。接下来,一旦你从Constant 取回它,你需要将它传递给Arithmetic,并确保两个参数的Numeric 相同。所以,简而言之,放弃!! 并根据参与者相互发送消息的方式编写代码。
    【解决方案2】:

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

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

    Method vs Function 和缺少括号

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

    scala> def f: () => Int = () => 5
    f: () => Int
    
    scala> def g(): Int = 5
    g: ()Int
    
    scala> f
    res2: () => Int = <function0>
    
    scala> f()
    res3: Int = 5
    
    scala> g
    res4: Int = 5
    
    scala> g()
    res5: Int = 5
    

    【讨论】:

    • 嗨,第一,在 scala 中调用函数时,如果没有参数,则无需使用 (),因此,编写 A 被评估并键入 A() 将是什么。我也已经尝试过使用数字但没有运气。任何提示问题的代码/设计重构将不胜感激。
    • @tiagoboldt 调用 method 时没有这种需要。调用函数时,有。
    • 我已经编辑了我的问题以使其更清晰。你在上面是对的,但这不是我的问题。希望现在更清楚了。
    猜你喜欢
    • 2010-12-21
    • 2018-04-09
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    相关资源
    最近更新 更多