CI/CD流水线创建方法?( 四 )
我还添加了一个list-iter便利函数 , 并为它提供了一个漂亮的printer参数 , 这样一旦知道列表输入 , 我们就可以在图表中标记案例 。
最后 , 虽然我说过不能在原语中使用let* , 但仍然可以使用其他一些monad(它不会生成图) 。 实际上 , 在实际系统中 , 我对原语使用了一个单独的let>操作符 。 这就要求主体使用底层promise库提供的非图生成承诺 , 因此不能在原语的主体中使用let*(或let>) 。
和Arrow进行比较
给定一个“dart” , 您可以通过定义例如 。
type('a,'b)arrow='apromise->'bpromise那么arr就是map , f>>>g就是有趣的x->g(fx) 。 第一个也可以很容易地定义 , 假设你有某种函数来并行地做两件事(比如上面的和我们的) 。
因此 , dartAPI(即使有let*hidden)仍然足以表示任何可以使用箭头API表示的管道 。
Haskell箭头教程使用一个箭头是有状态函数的示例 。 例如 , 有一个total箭头 , 它返回它的输入和以前调用它的每个输入的总和 。 e、g.用输入123调用三次 , 产生输出136 。 对输入序列运行管道将返回输出序列 。
本教程使用total定义mean1函数 , 如下所示:
mean1=(total&&&(arr(const1)>>>total))>>>arr(uncurry(/))因此 , 此管道复制每个输入编号 , 将第二个编号替换为1 , 将两个流相加 , 然后用其比率替换每对 。 每次将另一个数字放入管道时 , 都会得到迄今为止输入的所有值的平均值 。
使用dart样式的等效代码是(OCaml使用/ 。 对于浮点除法):
letmeanvalues=lett=totalvaluesinletn=total(const1.0)inmap(uncurry(/.))(pairtn)这对我来说更容易理解 。 通过定义标准运算符let+(对于map)和+(对于pair) , 我们可以稍微简化代码:
let(let+)xf=mapfxlet(and+)=pairletmeanvalues=let+t=totalvaluesand+n=total(const1.0)int/.n无论如何 , 这不是一个很好的箭头示例 , 因为我们不使用一个状态函数的输出作为另一个状态函数的输入 , 所以这实际上只是一个简单的applicative.
不过 , 我们可以很容易地用另一个有状态函数扩展示例管道 , 也许可以添加一些平滑处理 。 这看起来像箭头符号中的mean1>>>平滑 , 省道符号中的值|>平均值|>平滑(或平滑(平均值)) 。
注意:Haskell还有一个Arrows语法扩展 , 它允许Haskell代码编写为:
mean2=procvalue->dot<-total-<valuen<-total-<1returnA-<t/n这更像是飞镖符号 。
更多示例
我在ocurrent/ocurrent上建立了一个使用这些思想的稍微扩展版本的库 。 子目录lib_term是与这篇博客文章相关的部分 , 在TERM中描述了各种组合词 。
其他目录处理更具体的细节 , 例如与Lwtpromise库的集成 , 提供管理webUI或Cap’nProtoRPC接口 , 以及带有用于使用Git、GitHub、Docker和Slack的原语的插件 。
OCamlDocker基础镜像构建
ocurrent/docker-base-images包含一个管道 , 用于为各种Linux发行版、CPU架构、OCaml编译器版本和配置选项构建OCaml的Docker基本映像 。 例如 , 要在Debian10上测试OCAML4.09 , 可以执行以下操作:
$dockerrun--rm-itocurrent/opam:debian-10-ocaml-4.09:~$ocamlopt--version4.09.0:~$opamdepext-iutop[...]:~$utop----+-------------------------------------------------------------+------------------|Welcometoutopversion2.4.2(usingOCamlversion4.09.0)!|+-------------------------------------------------------------+Type#utop_helpforhelpaboutusingutop.-(11:50:06)-<command0>-------------------------------------------{counter:0}-utop#以下是管道的外观(单击可查看完整尺寸)
文章图片
它每周提取opam存储库的最新Git提交 , 然后为每个发行版构建包含该内容的基本映像和opam包管理器 , 然后为每个受支持的编译器变体构建一个映像 。 许多图片是建立在多个架构(amd64、arm32、arm64和ppc64)上的 , 并被推到DockerHub的一个暂存区 。 然后 , 管道将所有散列组合起来 , 将一个多架构清单推送到DockerHub 。 还有一些别名(例如 , debian表示debian-10-ocaml-4.09) 。 最后 , 如果有任何问题 , 则管道会将错误发送到松弛通道 。
您可能想知道 , 我们是否真的需要一个管道来实现这一点 , 而不是从cron作业运行一个简单的脚本 。 但是拥有一个管道可以让我们在运行它之前看到管道将要做什么 , 观察管道的进度 , 单独重新启动失败的作业 , 等等 , 几乎与我们编写的代码相同 。
如果你想看完成的流水线 , 可以阅读pipeline.ml 。
OCamlCI
ocurrent/ocaml-ci是一个用于测试OCaml项目的(实验性的)GitHub应用程序 。 管道获取应用程序的安装列表 , 获取每个安装的已配置存储库 , 获取每个存储库的分支和PRs , 然后针对多个Linux发行版和OCaml编译器版本测试每个存储库的头部 。 如果项目使用ocamlformat , 它还会检查提交的格式是否与ocamlformat的格式完全相同 。
- 老年|德兴市境内山水如画,被评为“中国天然氧吧”创建地区
- 为欧洲MaaS模型创建功能基础
- 基于串联充放电的锂动力电池单体一致性筛选方法
- 原神胡桃武器应该选择方法 胡桃武器应该怎么选择
- 奇迹暖暖云海拾珍/薄荷蜜旅套装怎么获得 获取方法分享
- 小白鞋用什么东西能洗白?这几个方法效果不错哦
- 春花生要想根系好,换一个方法种植,长势变化很明显
- 妄想山海新手入门指南 宠物寿命恢复方法
- 今日头像丨开心100%的方法
- 莴笋高产的种植方法,农民掌握以下要点,收获高产优质的莴笋
