Как написать подпись типа функции шаблона в Chapel
При попытке написать функцию среднего арифметического, возможно, лучше написать одну шаблонную функцию, а не две специфические функции типа. Можно писать:
proc mean(data: [?] ?T): real
но как ограничить Т бытием int
или real
.
Также можно ли определить массив, который может иметь либо int
, либо real
данные, т. е. существует ли способ выражения типов объединения для содержимого массива?
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.htmlChapel поддерживает безопасные союзы и массивы союзов. Союзы описаны в разделе 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;