В Scala, как мне представить смесь вещей и групп вещей в списке параметров? X = (X | атом) * - PullRequest
1 голос
/ 10 июня 2011

У меня есть метод * -параметр. Я хотел бы быть в состоянии передать смесь атомов и групп атомов в метод. В идеале я хотел бы, чтобы группы тоже могли их содержать.

Правило грамматики будет:

X = (X | atom)*

Группы должны быть упорядочены, но не обязательно класса List.

Мотивация состоит в том, что существует много вызовов метода * -параметров, и некоторые группы параметров встречаются более одного раза среди этих вызовов. Я хотел бы иметь возможность хранить эти группы в vals для их повторного использования.

Ответы [ 2 ]

4 голосов
/ 10 июня 2011

Почему бы не что-то подобное?

trait GroupOrAtom // or any other nicer name!
class Atom extends GroupOrAtom
class AtomGroup(val atoms: Seq[Atom]) extends GroupOrAtom

def process(elements: GroupOrAtom*) = ...

Если вы ищете более причудливый способ сделать это с использованием объединяемых типов, попробуйте прочитать удивительный пост Майлза Сабина о том, как реализовать объединяемые типы в Scala . Вероятно, это не должен быть ваш первый выбор, поскольку решение, реализующее общую черту, такую ​​как GroupOrAtom, становится все яснее и проще.

1 голос
/ 11 июня 2011

Может ли проходить кортежи у вас?

def processor(tokens: Any) = // pattern match on tuples

processor('atom)
processor('atom1, 'atom2)
processor('atom1, ('atom2a, 'atom2b))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...