Я пытаюсь написать функцию, которая должна возвращать разные пары в зависимости от ввода. Я применил «+ -/*» в Scala для моего конкретного использования. Каждый из них (+, -, *, /) имеет три реализации на основе ввода. У меня есть RDD и Float как входы, поэтому он может быть + между RDD и RDD, или Float и RDD, или Float и Float и так далее.Как назначить разные типы возврата функции в Scala?
Теперь у меня есть синтаксический анализатор, который читает выражение из ввода, например: RDD + 1, анализирует его и создает постфикс, чтобы сделать вычисления проще: RDD1 +, а затем я хочу сделать расчет, используя мой реализованный +. с помощью this algorithm Я пытаюсь изменить его таким образом, чтобы он выполнял вычисления на основе моего входного выражения. Например, он содержит:
var lastOp: (Float, Float) => Float = add
Как я могу изменить это: (Float, Float) => Float
к чему-то, что будет принимать (RDD, Float)|(RDD, RDD) |(Float, Float) => RDD = add
// моей реализации оного ???
Издание:
Я добавил эту часть с помощью двух ответов ниже: Хорошо я написал:
def lastop:(Either[RDD[(Int,Array[Float])], Float], Either[RDD[(Int,Array[Float])], Float]) => RDD[(Int,Array[Float])] = sv.+
, в котором св является экземпляром из другого класса, который я был переопределение + в том, что, но два разных способах, так что теперь я ма получаю сообщение об ошибке, которую я предполагаю, потому что компилятор путается, о которых реализация использовать это
error: type mismatch;
[error] found : (that: org.apache.spark.rdd.RDD[(Int, Array[Float])])org.apache.spark.rdd.RDD[(Int, Array[Float])] <and> (that: Float)org.apache.spark.rdd.RDD[(Int, Array[Float])]
[error] required: (Either[org.apache.spark.rdd.RDD[(Int, Array[Float])],Float], Either[org.apache.spark.rdd.RDD[(Int, Array[Float])],Float]) => org.apache.spark.rdd.RDD[(Int, Array[Float])]
Примечание: все, что он говорит, это две разные реализации для «+»
Вы можете использовать функцию перегрузки? То есть, реализуйте каждый из этих методов с разными типами аргументов. – marios
afaik, для этого вам нужно будет реализовать свою функцию «добавить» таким же образом. Таким образом, у вас будет только одна реализация, использующая Либо вместо нескольких перегруженных реализаций.Тем не менее, я буду обновлять свой ответ с помощью третьего варианта, надеюсь, лучше удовлетворить ваши потребности. –
Извините, для третьего варианта я думал по линиям Numeric [T], который, как я теперь думаю, не сработает. Тем не менее, я обновил свой ответ на то, что, как я думаю, может работать. Я не думаю, что то, что вы описываете, возможно именно так, как вы его описываете. –