2.1 zio入门——把函数作用作为工作蓝图

2023-11-07

ZIO标准库的核心数据类型是ZIO[R, E, A],这种类型的值被称为函数式作用

函数式作用是并发工作流的一种蓝图,如图1所示。该蓝图本质上是纯描述性的,必须执行才能观察到任何副作用,例如与数据库的交互,日志记录,流传输 网络中的数据,或接受请求。

ZIO [R,E,A]类型的函数式作用要求您在运行的时候提供R类型的值,并且在执行效果时,它可能会执行失败返回类型为E(错误类型),或者执行成功返回类型为A(成功类型)。

稍后我们将详细讨论这些类型参数。但是首先,我们需要了解将效果变为蓝图意味着什么。
在传统的过程编程中,我们习惯于代码的每一行直接与外界交互。例如,考虑以下代码片段:

val goShopping: Unit = {
println("Going to the grocery store")
}

scala程序一旦运行goShopping变量,就会立刻输出 Going to the grocery store. 这种风格的编程方式是过程式编程。基本上所有程序员都熟悉这种编程方式,因为大多数编程语言天生就是过程式的。
对于简单的程序而言,过程式编程是非常方便的。但是当我们这样写程序的时候,我们想要做的事情(去商店)与我们想要做的事情(现在去商店)纠缠不清。这种纠缠可能导致许多难以理解和测试的样板代码,难以更改,并且充满了直到生产才发现的细微错误。
例如,假设我们实际上不想现在去杂货店,而是从现在开始一个小时。我们可能会这样去编写代码:

ScheduledExecutorService:

import java.util.concurrent.{ Executors, ScheduledExecutorService } 
import java.util.concurrent.TimeUnit._

val scheduler: ScheduledExecutorService = Executors.newScheduledThreadPool(1)

scheduler.schedule(
	new Runnable { def run: Unit = goShopping }, 
	1,
	HOURS
) 

scheduler.shutdown()

在这段程序中我们创建了一个executor,在一小时后执行我们的 goShopping 操作。然后在程序执行完之后 shut down 调度器。
该解决方案不仅涉及难以理解,测试和难以更改的样板代码,而且还存在一个细微的错误!
因为goShopping是直接执行的,而不是工作计划,所以一旦JVM加载 goShopping,就会将 “Going to the grocery store”打印到控制台。因此,我们现在要去杂货店,而不是现在的一个小时!

实际上,我们计划在一小时内执行的唯一操作就是返回goShopping的Unit值,这根本不需要执行任何操作。

在这种情况下,我们可以通过将goShopping定义为def而不是val来推迟其计算,从而解决问题。但是这种方法脆弱且容易出错,迫使我们仔细考虑何时对程序中的每个语句进行求值,而不再是语句的顺序。

我们还必须注意不要过早计算。我们可能将其赋值或放入数据结构中,这可能会导致过早计算。好像我们谈购物一样,但是一旦提到“食品”一词,它们就已经在门口了!实际上我们只是打算去购买而已。

解决此问题(以及并发编程中的大多数问题)的方法是在程序值中创建描述我们想要做什么的语句。这样,我们就可以将我们想做的事情与想怎么去做这件事情分开。

下面这段代码展示了怎么用zio编写这段程序:

import zio._
val goShopping = ZIO.effect(println("Going to the grocery store"))

在这段程序中我们用 effect 的构造函数创建了一个 goShopping 的函数式作用。这个 effect 只是描述了我们要去超时,但是事实上没有立刻做任何事。这主要是因为 effect 的参数是 effect :=> A, 这是 () => A 的简写。可以在 scala REPL中测试这段代码,你并不会得到任何输出。

为了去超市,我们必须运行这个执行和定义分开的作用。从而使我们可以消除上面提到的问题,并极大地简化代码。

通过这种定义 go shopping的方式,我们现在可以阐述 在怎么把 ”how“ 和 “what” 分开,然后通过组合作用的方式解决复杂业务问题。

下面的示例通过 ZIO类型的静态方法 delay ,将 goShopping函数转换为一个一小时后执行的副作用。

import zio.clock._ 
import zio.duration._
val goShoppingLater = goShopping.delay(1.hour)

得益于可以将工作流描述为普通的不可变值功能,我们不必担心怎么去定义goShopping又或者过早的运行他。同样,delay 运算符返回的值只是另一个effect,因此我们可以轻松地使用它以相同的方式构建更复杂的程序。

在ZIO中,每个ZIO效果都只是一种描述-并发工作流程的蓝图。在编写程序时,我们创建了更大,更复杂的蓝图,这些蓝图更接近于解决业务问题。当我们完成并具有描述我们需要做的所有事情的效果时,我们将其交给ZIO runtime,ZIO runtime将执行该蓝图并产生程序结果。

那么我们如何实际运行ZIO效果?最简单的方法是扩展App特性并实现run方法,如以下代码片段所示:

import zio._
object GroceryStore extends App { 
	def run(args: List[String]) = goShopping.exitCode 
}

run函数要求我们返回一个ExitCode,该退出代码描述了进程终止时要使用的退出值。 在上定义的exitCode方法是一种方便的方法,可将所有成功都转换为ExitCode(0),将所有失败转换为ExitCode(1)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.1 zio入门——把函数作用作为工作蓝图 的相关文章

  • RedisTemplate和StringRedisTemplate的区别

    RedisTemplate和StringRedisTemplate的区别 1 两者的关系是StringRedisTemplate继承RedisTemplate 2 两者的数据是不共通的 也就是说StringRedisTemplate只能管理
  • 索引构造与信息检索:让 ChatGPT 成为 Selenium 问答助手

    这是chatgpt为我生成的3个标题 我选了第3个 利用 Langchain 和 GPT 实现 Selenium 机器人自动问答 向量化存储和检索 如何用相似度搜索匹配 Selenium 知识 索引构造与信息检索 让 ChatGPT 成为
  • open3d python版本安装及安装过程中遇到的问题

    本文介绍一下我在安装open3d包过程中遇到的问题 pip安装 pip install open3d pip install open3d i https pypi tuna tsinghua edu cn simple or pip in
  • npm镜像设置

    查看镜像列表 npm isntall g nrm nrm ls 根据镜像列表地址来设置镜像 例如 npm config set registry https registry npmjs org 查看镜像 npm config get re
  • 高通QCM6125的LK部分(uefi/xbl)编译

    高通在QCM6125安卓10 0加入了UEFI 以前的lk相关代码移到了boot images QcomPkg路径下 编译方式和之前也不同了 编译环境 编译时错误提示 需要工具在这个路径 pkg qct software llvm rele
  • KNX协议入门

    KNX协议入门 转自 https wenku baidu com view 65b0a25a55270722182ef706 html 如有侵权 请联系qq 2453419889 我将立即删除 一 KNX技术简介 KNX通过一条总线将各个分
  • Dapper功能讲解

    简述 适用特性 使用Dapper流程 代码示例 简述 Dapper是一个轻量级的ORM工具 ORM框架的核心思想是对象关系映射 ORM是将表与表之间的操作 映射成对象和对象之间的操作 就是通过操作实体类来达到操作表的目的 从数据库提取的数据
  • [637]文件或目录损坏且无法读取CHKDSK修复方法

    文件或目录损坏且无法读取 不要太担心是出现了磁盘坏道 也许只是小小的存储问题 解决方法很简单 用chsdsk命令即可 方法如下 开始 运行 输入cmd 输入chkdsk 盘符 f 例如 chkdsk c f 等命令运行完即可 注意 冒号后面
  • matlab中size()的用法

    size A 设有一矩阵为A 则size A 返回的是一行向量 该行向量的第一个元素时矩阵的行数 第二个元素是矩阵的列数 size A 1 获取矩阵A的行数 size A 2 获取矩阵A的列数
  • 数学的1000+篇文章总结

    数学的1000 篇文章总结 本文收集和总结了有关数学的1000 篇文章 由于篇幅有限只能总结近期的内容 想了解更多内容可以访问 http www ai2news com 其分享了有关AI的论文 文章 图书 query 第13章 爱因斯坦 量
  • C#实现程序的版本升级更新

    我们做了程序 不免会有版本升级 这就需要程序有自动版本升级的功能 那么看看我是如何实现程序自动更新的 直接上代码 using System using System Collections Generic using System Text
  • 数学建模学习2论文排版

    如何写论文 一 四点注意事项 一 标题与正文层次分明 二 正文排版紧凑 三 表格与图片格式 四 公式编辑 二 如何写标题 一 要求 二 格式及示例 三 如何写摘要 一 要求 二 格式及示例 1 总体格式图 2 开头段模板 3 中间段模板 4
  • 机器学习笔记-感知机对偶形式

    文章目录 前言 一 感知机对偶形式 二 感知机对偶形式的实现 总结 前言 感知机模型是有两种形式的 上一篇文章中详细学习了感知机的原始形式数学模型 我们知道 感知机应该还有对偶形式 这篇文章就来记录一下感知机对偶形式的的数学模型 一 感知机
  • Object.entries()

    Object entries 方法返回一个给定对象自身可枚举属性的键值对数组 其排列与使用 for in 循环遍历该对象时返回的顺序一致 区别在于 for in 循环还会枚举原型链中的属性 语法 Object entries obj 参数

随机推荐

  • 构造函数与析构函数的保护权限

    通常我们如果希望对象只在堆上创建 我们会将析构函数定义为protect或private类型 这种情况下我们还要添加一个函数来析构对象 因为此时在类外部无法使用delete释放对象 因为析构函数被保护 那么究竟为什么限制析构函数的访问权限可以
  • 下载网页视频简单的办法之一

    下载网页视频简单的办法之一 下载小网站网页视频的简单办法之一 添加插件 使用方法 局限性 下载小网站网页视频的简单办法之一 经常在小网站 比如91xxx youxxxx 上看到喜欢的小视频 想要收藏 你懂的 无赖很多都要VIP才给下载 以前
  • kali_linux (install版)移动硬盘(物理机)安装记录

    作者 瓴 时间 2023 04 23 kali linux install版 移动硬盘 物理机 安装问题记录 1 安装介绍 1 1 相关参数 2 kali 安装 2 1 制作系统启动U盘 2 2 移动硬盘分区 2 2 系统安装 2 3 引导
  • UE4_异步_数据处理(Json)

    如果一个数字城市demo 需要将第三方海量的数据进行处理展示 将数据的处理放在GameThread 上显然是不合理 这个时候需要用多线程解析数据 防止游戏线程的阻塞 关于异步和多线程 前两天面试被别人问到一个问题 异步和多线程的区别 面试的
  • 代码静态测试工具

    Ounec5 0 扫描语言VB C C C Java 属于付费工具 Coverity Prevent 扫描语言有C C C Java 属于付费工具 Stake SmartRiskAnalyzer 扫描语言C C Java 属于付费工具 Ra
  • 【缓存】一种新的缓存 Caffeine Cach 介绍

    1 概述 转载 真正的缓存之王 Google Guava 只是弟弟 Guava Cache 他的优点是封装了get put操作 提供线程安全的缓存操作 提供过期策略 提供回收策略 缓存监控 当缓存的数据超过最大值时 使用LRU算法替换 这一
  • upload-labs通关秘籍和安装环境

    upload labs通关 一 什么是upload labs 二 漏洞 三 安装环境 四 小试牛刀 第一关 pass 01 客户端检测绕过 js检测 第二关 pass 02 content type 服务器端检测 MIME 类型 第三关 上
  • element-ui组件学习

    element ui组件的大致分类 element ui的组件大致分为以下几类 Basic Form Data Notice Navigation Other 组件分类的大致意思 basic组件类型 是一些关于页面布局 按钮和icon等相关
  • 后台数据转换成json数组字符串到前端方法

    1 将结果集ResultSet转化为List集合 对结果集转换成list集合 public List
  • window丢失msvcp90.dll怎么办

    今天在使用py2exe生成编译的时候出现了 No such file or directory msvcp90 dll 下面是解决的方法 1 首先把msvcp90 dll下载到本机 这个就要去网上自己找一下了 2 将下载好的 msvcp90
  • 界面组件Qt Widgets入门指南,让跨平台嵌入式界面开发更简单!

    Qt 是目前最先进 最完整的跨平台C 开发工具 它不仅完全实现了一次编写 所有平台无差别运行 更提供了几乎所有开发过程中需要用到的工具 如今 Qt已被运用于超过70个行业 数千家企业 支持数百万设备及应用 点击获取Qt Widget组件下载
  • php编译问题Cannot find OpenSSL's evp.h

    在php redis的遇到 Cannot find OpenSSL s
  • 树的遍历方式

    树的三种遍历 一棵树的三种遍历方式 先序遍历 中序遍历 后序遍历 前中后三种顺序其实指的是根的顺序 具体看后文 先序遍历 访问顺序 1 根节点 2 左子树 3 右子树 这里根节点是最优先级 因为是先序 根节点放最前 1 中序遍历 访问顺序
  • CSRF 漏洞原理详解及防御方法

    跨站请求伪造 攻击者可以劫持其他用户进行的一些请求 利用用户身份进行恶意操作 例如 请求http x com del php id 1 是一个删除ID为1的账号 但是只有管理员才可以操作 如果攻击者把这个页面嵌套到其他网站中 img src
  • 各种操作系统支持的磁盘格式对比

    各种操作系统支持的磁盘格式对比 操作系统 支持的磁盘格式 Windows FAT32 exFAT NTFS macOS HFS APFS Linux EXT2 EXT3 EXT4 XFS Btrfs BSD UFS Solaris ZFS
  • MacOS搭建Flutter 环境

    流程 第一步 官网下载对应版本的flutter SDK MacOS有两个版本 x64和 arm64 查看命令 uname a 官网链接 Flutter SDK archive Flutter 下载成功后会自动解压 把Flutter文件放到自
  • 【4】Docker容器相关命令

    1 查看 容器 1 查看正在运行的容器 docker ps 2 查看所有容器 包括 运行中的容器 和 没有运行的容器 docker ps a a 是 all 缩写 3 查看最后一次运行的容器 docker ps l l 是 last 的缩写
  • easyexcel功能扩展:读取excel日期格式(包括日期格式和文本格式)

    实体类属性 ExcelProperty value 时间 index 11 private String time 调用DateUtil DateUtil setParams yyyy MM dd yyyy MM dd DateUtil f
  • 两台计算机如何组成局域网,教你两台电脑如何建立局域网,win10系统为例

    虽然我们可以通过第三方的工具来传输文件 但是如果我们的电脑无法上网怎么办 想要两台电脑建立局域网发送大文件怎么操作呢 今天就这个两台电脑建立局域网的方法给大家讲解一下 希望可以帮助到有需要的朋友们 两台电脑建立局域网步骤 1 点击网络图标
  • 2.1 zio入门——把函数作用作为工作蓝图

    ZIO标准库的核心数据类型是ZIO R E A 这种类型的值被称为函数式作用 函数式作用是并发工作流的一种蓝图 如图1所示 该蓝图本质上是纯描述性的 必须执行才能观察到任何副作用 例如与数据库的交互 日志记录 流传输 网络中的数据 或接受请