Как написать подпись типа функции шаблона в Chapel


При попытке написать функцию среднего арифметического, возможно, лучше написать одну шаблонную функцию, а не две специфические функции типа. Можно писать: proc mean(data: [?] ?T): real но как ограничить Т бытием int или real.

Также можно ли определить массив, который может иметь либо int, либо real данные, т. е. существует ли способ выражения типов объединения для содержимого массива?

1 3

1 ответ:

Чтобы ограничить тип T типами int или real любого размера, вы можете добавить предложение where к определению функции:

proc mean(data: [] ?T): real where isIntType(T) || isRealType(T) { ... }

Функции isIntType и isRealType определены в модуле типы: http://chapel.cray.com/docs/latest/modules/standard/Types.html

Chapel поддерживает безопасные союзы и массивы союзов. Союзы описаны в разделе 17 спецификации языка Chapel: http://chapel.cray.com/docs/latest/_downloads/chapelLanguageSpec.pdf

union IntOrReal {
  var i: int;
  var r: real;
}

var intRealArray: [1..2] IntOrReal;
intRealArray[1].i = 1;
intRealArray[2].r = 2.0;