Передача функций и работа над их результатами в Scala Actors - PullRequest
3 голосов
/ 12 октября 2011

Я реализую приложение на основе акторов в 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.

Можете ли вы помочь с разработкой / внедрением такой системы?

Редактировать: Код обновлен, чтобы лучше отражать проблему. Ошибка в: ошибка: не удалось найти неявное значение для параметра улик типа Numeric [Any] val a = новая арифметика ({c5 !! "значение"}, {c5 !! "значение"})

Мне нужно быть в состоянии передать функцию, которая будет оцениваться в актере, всякий раз, когда я ее вызываю. В этом примере используются статические значения, но я буду использовать динамические значения в будущем, поэтому передача значения не решит проблему. Кроме того, я хотел бы получить различные типы переменных (Int / Long / Double) и при этом иметь возможность использовать один и тот же код.

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Ошибка: 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].

0 голосов
/ 12 октября 2011

Я почти уверен, что не ваша проблема.Во-первых, A и B являются функциями, а функции не имеют + или *.Если вы звоните A() и B(), то у вас может быть шанс ... за исключением того факта, что они java.lang.Number, что также не имеет + или * (или любой другой метод, который вы ожидали бы иметь).

По сути, не существует типа «Number», который является суперклассом или интерфейсом всех чисел, по той простой причине, что в Java его нет.Есть много вопросов, касающихся этой темы, о переполнении стека, включая некоторые из моих самых первых вопросов о Scala - исследуйте scala.math.Numeric, который является наилучшим приближением на данный момент.

Метод против функции и отсутствие скобок

Методы и функции - это разные вещи - смотрите тонны связанных вопросов здесь, и правило относительно удаления скобок также отличается.Я позволю 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
...