2013-09-10 2 views
2

Я хотел бы определить общую функцию для извлечения ключей из карты, что-то вроде этого:Как определить общую (полиморфную) функцию в Rascal?

public list[K] keys(map[K,V] aMap) { 
    return [ key | key:val <- aMap ]; 
} 

Хотя никакой ошибки синтаксиса не дается, это не работает. Есть ли способ сделать это?

ответ

2

Вы можете определить это как

public list[&K] keys(map[&K,&V] aMap) { 
    return [ k | k <- aMap ]; 
} 

Обратите внимание, что ключи являются упорядоченными, так что он может иметь больше смысла возвращать их в виде набора, а не как список. Вы также всегда можете получить ключи или значения, как наборы непосредственно проецировать их из карты, используя либо

aMap<0> 

для набора ключей или

aMap<1> 

для набора значений. Наконец, модуль Set содержит функцию ToList, так что вы могли бы сделать это в одной строке, как

toList(aMap<0>) 

, который даст вам тот же результат, что и вызов функции клавиш.

+0

, и если у карты есть имена, вы можете проецировать с использованием имен, как в 'map [& K keys, & V values] x = ...; x ; 'или' x '. – jurgenv