【问题标题】:How to write the type signature of a template function in Chapel如何在 Chapel 中编写模板函数的类型签名
【发布时间】:2016-09-08 09:34:17
【问题描述】:

在尝试编写算术平均函数时,最好编写一个模板函数而不是两个特定于类型的函数。可以写: proc mean(data: [?] ?T): real 但是如何将 T 限制为 intreal

还可以定义一个可以包含intreal 数据的数组,即有没有一种方法可以表示数组内容的联合类型?

【问题讨论】:

    标签: function templates types chapel


    【解决方案1】:

    要将 T 的类型限制为任意大小的 intreal 类型,您可以在函数定义中添加 where 子句:

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

    isIntTypeisRealType 函数在类型模块中定义:http://chapel.cray.com/docs/latest/modules/standard/Types.html

    Chapel 支持安全联合和联合数组。联合在 Chapel 语言规范的第 17 节中进行了描述: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;
    

    【讨论】:

    • 非常类似于 D 模板约束 dlang.org/concepts.html,这使得事情在概念上很简单。如果使用 IntOrReal 如何添加 where 约束来增加 isIntType 和 isRealType?
    • where 子句可以包含计算结果为布尔参数(编译时间常数)的任何内容。您可以在类型上使用相等运算符将 T 与任何类型进行比较:where isIntType(T) || isRealType(T) || T == IntOrReal
    • 有没有一次性初始化整个联合数组的语法?
    • 您可以在字段访问器上使用提升(Chapel 规范中的第 25.4 节)来分配例如到所有整数字段intRealArray.i = 1;
    • 很高兴知道将所有元素初始化为给定值,整个数组操作。如果有一组不同的值呢? (我想避免使用单个条目的分配,我想要类似其他语言的东西:var x = [0, 4.7, 3, 3, 5.6];
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2022-01-10
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多