当前位置: 首页 > article >正文

Heptagon 迭代器

Heptagon 对数组数据类型,支持迭代器高阶运算如 map, fold, mapfold, mapi, foldi。这些运算,在 Scade 语言中有同名运算符,在语义上也一致。

map 迭代器

map 是一种 arrays to arrays 运算。其形式如 map<<size>> fun (arrs)。其中 size 为迭代次数; arrs 为输入数组列表; fun 为每次迭代计算的算子。fun 每周期计算输入数组的一组元素,得出的结果作为输出数组的元素。map 使用样例如

fun addFun(i1,i2: int) returns (o: int) 
let 
  o = i1 + i2;
tel 

fun mapFun(i1,i2: int ^3) returns (o: int ^3)
let 
  o = map<<3>> addFun(i1, i2);
tel

在上例中,o = map<<3>> addFun(i1, i2);map 迭代器表达式。迭代次数为3,输入数组 i1, i2 为长度为3的一维数组。在每次迭代中,应用 addFun 算子对数组元素进行计算,在本例中,计算操作为 + 操作。输出数组为输入数组元素的和。

mapi 迭代器

mapi 迭代器的语义与 map 相同。形式如 mapi<<size>> fun (arrs)。不同点在于对 fun 的输入参数列表中,最末需包含整型参数,指示当前迭代的数组索引。mapi 使用样例如

fun andFun(i1,i2: bool; idx: int) 
  returns (o: bool) 
let 
  o = i1 and i2;
tel 

fun mapiFun(i1,i2: bool ^3) 
  returns (o: bool ^3)
let 
  o = mapi<<3>> andFun(i1, i2);
tel

上例与 map 的使用样例类似。需要注意的是算子andFun 的输入参数列表。在参数列表末尾,存在 idx: int 参数,指示当前迭代的索引值。

fold 迭代器

fold 迭代器的语义与 Scade 中 fold 语义一致,是arrays to scalar 的一种高阶运算。在Heptagon 中其形式如 fold<<size>> fun (arrs, acc)。其中,size 为迭代次数;fun 为迭代算子; arrs 为输入列表; acc 为累计计算的初始值。fold 计算的结果为迭代计算后,累计的计算值。

fold 的使用样例如

fun addFun(i1,i2,acc: int) returns (o: int) 
let 
  o = acc + i1 + i2;
tel 

fun foldFun(i1,i2: int ^3) returns (o: int)
let 
  o = fold<<3>> addFun(i1, i2, 0);
tel

在该例子中,fold<<3>> addFun(i1, i2, 0); 为 fold 迭代器操作。迭代次数为 3addFun 为迭代计算算子。其中 i1, i2 为 fold 操作的输入数组参数。累计器的初始值为 0。在该例程中,迭代算子的计算效果为将数组元素累加至累计器。

foldi 迭代器

foldi 迭代器的语义同 fold 相同,不同点在于对迭代器算子,输入参数的末尾需包含指示迭代索引的整型参数。foldifold 的拓展,与mapimap 的拓展相同。

foldi 使用样例如

fun addFun(i1,i2,acc, idx: int) returns (o: int) 
let 
  o = acc + i1 + i2;
tel 

fun foldiFun(i1,i2: int ^3) returns (o: int)
let 
  o = foldi<<3>> addFun(i1, i2, 0);
tel

在该例子中,逻辑与 fold 迭代器例子一致。需注意的是在算子 addFun 的输入参数列表中,idx: int 参数指示当前迭代的索引。

mapfold 迭代器

mapfoldmap迭代器与fold 迭代器的集合。Heptagon 中 mapfold 的语义与 Scade 中 mapfold 语义一致。形式如 mapfold <<size>> fun (arrs, acc)mapfold 的效果为输出 map 迭代计算后的输出数组,与 fold 迭代计算效果的累计计算结果。

mapfold 使用样例如

fun addFun(i1,i2,acc: int) 
  returns (o, o_acc: int)
let 
  o_acc = i1 + i2 + acc;
  o = i1 + i2;
tel 

fun mapfoldFun(i1,i2: int^3) 
  returns (o: int^3; acc: int)
let
  (o, acc) = mapfold<<3>> addFun(i1, i2, 0);
tel 

在该例程中,迭代算子 addFun 的输出为输出数组的元素与累计器值。


http://www.kler.cn/a/529388.html

相关文章:

  • 《 C++ 点滴漫谈: 二十五 》空指针,隐秘而危险的杀手:程序崩溃的真凶就在你眼前!
  • CSS(快速入门)
  • mysql大表的解决方案,及Hive分页查询
  • 关于系统重构实践的一些思考与总结
  • Spring Boot + Facade Pattern : 通过统一接口简化多模块业务
  • Vue 3 30天精进之旅:Day 11 - 状态管理
  • 【含文档+PPT+源码】基于微信小程序农家乐美食餐厅预约推广系统
  • P_all: 投影矩阵(Projection Matrix)
  • AI智慧社区--人脸识别
  • 详解CSS `clear` 属性及其各个选项
  • Rust 控制流语法详解
  • 蓝桥杯之c++入门(二)【输入输出(上)】
  • Lesson 129 70 miles an hour
  • 【C++】 STL -- 容器(2)
  • AI-on-the-edge-device - 将“旧”设备接入智能世界
  • 【开源免费】基于Vue和SpringBoot的校园网上店铺系统(附论文)
  • 区间加法 II - 解题思路与代码解析
  • 14-9-2C++STL的set容器
  • PHP XML操作指南
  • 音视频入门基础:RTP专题(8)——使用Wireshark分析RTP
  • 【Convex Optimization Stanford】Lec5. Duality 对偶问题
  • Java设计模式:行为型模式→访问者模式
  • 基于直觉的理性思维入口:相提并论的三者 以“网络”为例
  • 【SLAM】于AutoDL云上GPU运行GCNv2_SLAM的记录
  • ResNet--深度学习中的革命性网络架构
  • Unity 2D实战小游戏开发跳跳鸟 - 跳跳鸟碰撞障碍物逻辑