Scala 中的 Future[Either[AppError, Option[User]]]

2024-03-07

正如标题所提到的,使用这样的数据结构有意义吗?我来一一解释一下:

  • Future - 代表异步计算
  • 要么 - 传达已知错误
  • 选项 - 传达该值可能不存在

看到这个的时候我有点害怕。使用这种类型组合是一个好的做法吗?


让我们看一下解决方案空间:

Success(Right(Some(user))) => Everythig OK, got an user
Success(Right(None)) => Everything OK, no user
Success(Left(AppError)) => Something went wrong at app level
Failure(Exception) => Something went wrong

这看起来很有表现力,但是当您尝试与其他调用组合这样的嵌套结构时,事情很快就会变得丑陋(请参阅将阻塞代码转换为使用 scala futures https://stackoverflow.com/questions/40161024/converting-blocking-code-to-using-scala-futures/40161838#40161838) 的组合示例Future[Option[T]])

所以以下最小功率原则 http://www.lihaoyi.com/post/StrategicScalaStylePrincipleofLeastPower.html, 我们问自己:是否有保留语义的不太复杂的替代方案? 有人可能会争辩说Future[User]如果我们充分利用异常(和异常层次结构)的潜力就足够了。

让我们检查:

Everythig OK, got an user => Success(user)
Everything OK, no user => Failure(UserNotFoundException)  (Application level exception)
Something went wrong at app level => Failure(AppException) (Application level exception)
Something went wrong => Failure(Exception) (System-level exception)

这种方法的唯一限制是 API 的用户需要了解异常情况,而这些异常情况并未在界面中自行记录。优势在于拥有一个基于Futures 将允许与其他的富有表现力的单子组合Future基于 API。

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

Scala 中的 Future[Either[AppError, Option[User]]] 的相关文章

  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • Scala:如何将可变参数指定为类型?

    代替 def foo configuration String String 我希望能够写 type Configuration String String def foo configuration Configuration 主要用例是
  • 更改 build.sbt 自定义任务中的版本

    我在 build sbt 中定义了一个自定义任务 val doSmth taskKey Unit smth doSmth version 1 0 SNAPSHOT 但它不会改变版本 我真正想要的是自定义 sbt 发布任务 它将始终将相同的版
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez
  • 如何使用 Spark 2 屏蔽列?

    我有一些表 我需要屏蔽其中的一些列 要屏蔽的列因表而异 我正在读取这些列application conf file 例如 对于员工表如下所示 id name age address 1 abcd 21 India 2 qazx 42 Ger
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 具有继承类型的 Aux 模式推理失败

    我有一个复杂的玩具算法 我希望纯粹在类型级别上表示 根据饮食要求选择当天菜肴的修改 对卷积表示歉意 但我认为我们需要每一层才能达到我想要使用的最终界面 我的代码有一个问题 如果我们表达一个类型约束Aux 模式生成的类型基于另一个泛型类型 它
  • Vim 脚本中的“reduce”函数

    Vim 脚本有一些非常基本的函数式编程工具 It has map and filter 但据我所知它缺乏reduce 功能 Reduce https en wikipedia org wiki Fold 28higher order fun
  • “功能性”Rust 对性能有哪些影响?

    我正在关注 Rust 轨道运动 io https exercism io 我有相当多的 C C 经验 我喜欢 Rust 的 功能 元素 但我担心相对性能 我解决了 行程编码 问题 https exercism io tracks rust
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • IntelliJ IDEA 不会从 SBT 项目加载 Lift 库

    我通过创建了一个空白项目sbt使用最基本的指南 具体来说 gt cd xyz gt sbt here we create a new project w Scala 2 8 1 gt lift is org lifty lifty 1 6
  • Java 拥有闭包后 Scala 的优势 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着 Java 中添加了闭包 作为语言选择 Scala 相对于 Java 的优势是什么 有人可以详细说明一下有什么优点吗 除了闭包 J
  • Scala:类型参数中的问号

    我试图理解以下代码 来自 Scalaz 库 def kleisliIdApplicative R Applicative Kleisli Id R 我假设一种形式T P0 是一个带有参数的类型构造函数 但是我无法找到解释类型参数中问号用法的
  • 在管道中重用变量的功能方式

    在 javascript 和 typescript 中与 Ramda 一起使用函数式编程 我经常发现自己编写如下代码 const myFun c gt const myId c id const value pipe getAnotherO
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • IntelliJ IDEA 能否正确格式化 scala.html 文件以及如何启用它?

    IntelliJ IDEA 12 Ultimate 和 CE 格式化我的 main scala html 文件中的以下行 在 Play 应用程序中 main css gt As main css gt 是的 真的 它分解了带引号的字符串 我
  • 使用 Akka 1.3 的 actor 时,我需要注意生产者-消费者速率匹配吗?

    使用 Akka 1 3 时 我是否需要担心当生成消息的 Actor 生成消息的速度比使用消息的 Actor 的处理速度快时会发生什么 如果没有任何机制 在长时间运行的进程中 队列大小将增大以消耗所有可用内存 The doc http doc
  • Spark:查找前 n 个值的高性能方法

    我有一个很大的数据集 我想找到具有 n 个最高值的行 id count id1 10 id2 15 id3 5 我能想到的唯一方法是使用row number没有分区就像 val window Window orderBy desc coun

随机推荐

  • 如何使用 box2d 在 libgdx 中拖动对象?

    我已将对象添加到box2d世界在libgdx 我想知道是否可以用鼠标拖动对象 如果是这样 怎么办 thanks 这里有几个选项 您可以使用鼠标关节 也可以使用运动体并手动设置其位置 看看如何使用鼠标关节的一个很好的例子 http code
  • 图像作为绘制形状的“背景”

    是否可以使用图像而不是颜色来 填充 HTML5 画布上的形状 我画了一堆形状 各个角以 45 度角切掉的正方形 我希望能够用图像而不是颜色来 填充 这些形状 目前我有一行指出 context fillStyle 123456 example
  • 如何使用 Meteor.js、Twitter 和 Oauth 发布推文

    我在使用 Meteor 和 Twitter 时遇到了一些问题 我想做的就是通过点击按钮发布一条推文 为此 我必须通过 Oauth 向 Twitter 服务验证自己的身份 目前 我正在以一种非常复杂的方式进行身份验证 从客户端到服务器并返回
  • 适用于 Android 的本机 OpenCV 示例抛出 UnsatisfiedLinkError

    我尝试在模拟器上运行 opencv android 示例 带有本机代码的示例 例如示例 教程 2 高级 1 添加本机 OpenCV 失败 我有一个Win7 x86系统 我可以构建本机库 但如果运行示例 我总是会遇到以下异常 10 04 08
  • 每个线程组的概率

    如果我的测试计划中有 3 个线程组 如何为每个组设置恒定概率 请求权重 我是 JMeter 的新手 您能在屏幕截图上显示您的设置吗 只需将每组的线程数设置为测试总线程数的一个因子即可 如果有 100 个 VU 则 g1 设置为 50 g2
  • 我如何使用 iOS 中的 Fabric 框架从我的应用程序中注销 Twitter

    在我的 iOS 应用程序中 我使用集成 Twitter 登录织物框架 TWTR作曲家 第一次登录并在 Twitter 上发布推文时 它工作正常 但我无法在我的应用程序中从 Twitter 注销 当我第二次尝试登录时 twitterlogin
  • LINQ 和递归

    考虑以下 public class Box public BoxSize Size get set public IEnumerable
  • 无法在 django 模板中使用 unicode 字符串

    我在 django 模板中使用了 B M N TO N 字符串 它引发了错误 utf8 编解码器无法解码位置 569 中的字节 0xd4 无效的连续字节 但是当我使用 BO MON TOAN 字符串时 它不会引发错误 所以 我在模板中使用了
  • 红宝石:能被4整除

    这工作正常 但我想让它更漂亮 并容纳所有能被 4 整除的值 if i 4 i 8 i 12 i 16 i 20 i 24 i 28 i 32 end 有什么聪明 简短的方法可以做到这一点吗 尝试这个 if i 4 0 这被称为 模运算符 h
  • 对于 C++ 插件系统来说什么是安全的?

    C 中的插件系统很困难 因为 ABI 没有正确定义 并且每个编译器 或其版本 都遵循自己的规则 然而 Windows 上的 COM 表明创建一个最小的插件系统是可能的 该系统允许具有不同编译器的程序员使用简单的接口为主机应用程序创建插件 让
  • 使用声明的可变基类无法在 MSVC 中编译

    我正在尝试实现一个可变访问者类 template
  • 如何以Python方式将 scipy.optimize.OptimizeResult 结果对象保存到文件中以便以后轻松访问?

    从 scipy optimize OptimizeResult 保存结果对象的最佳方法是什么 以便可以从保存的文件轻松访问其参数 我目前正在将结果保存为字符串 但这样 当我需要再次引用它时 我需要解析整个字符串来识别参数数组或函数值等对象
  • 我可以欺骗 libc (GLIBC_2.13) 加载它没有的符号(来自 GLIBC_2.15)吗?

    在我尝试让 Steam for Linux 在 Debian 上运行时 我遇到了一个问题 libcef Chromium 嵌入式框架 可以很好地工作GLIBC 2 13 Debian 测试中的eglibc 可以提供 但是需要一个讨厌的额外功
  • NVIDIA GPU 的 CUDA 核心和 OpenCL 计算单元之间有什么关系?

    我的电脑有一块 GeForce GTX 960M NVIDIA 声称它有 640 个 CUDA 核心 然而 当我运行 clGetDeviceInfo 来查找计算机中的计算单元数量时 它打印出 5 见下图 听起来 CUDA 核心与 OpenC
  • Facebook Messenger 如何与 Wit.ai Bot Engine 连接?

    在 Facebook 的文档中 他们提到了 wit ai Bot Engine 但我在网上找不到任何地方解释如何将您在 Wit 中构建的故事与 Facebook Messenger 应用程序连接起来 Wit ai 需要一个输入 用户输入 句
  • SVG旋转变换矩阵

    我从 SVG 文件中的元素解析了一个转换属性 例如rotate 45 30 50 我想将其转换为矩阵形式 我搜索了它 我所能找到的只是rotate a 没有坐标 看起来像这样 cos a sin a sin a cos a 0 0 谁能告诉
  • C# Linq 合并两个字典[重复]

    这个问题在这里已经有答案了 如何使以下方法更具函数式 linq 风格 public static Dictionary
  • 使用 python 和 opencv 检测图像中的文本区域

    我想使用 python 2 7 和 opencv 2 4 9 检测图像的文本区域 并在其周围画一个矩形区域 就像下面的示例图片所示 我对图像处理很陌生 所以任何想法如何做到这一点将不胜感激 有多种方法可以检测图像中的文本 我建议看看这个问题
  • 如何在 Rust 中反序列化(使用 serde)可选 json 参数,可以是字符串或字符串数​​组

    我是 Rust 新手 我正在尝试使用 serde 库反序列化 JSON 数据 我有以下 JSON 结构 foo bar speech something or foo bar speech something something else
  • Scala 中的 Future[Either[AppError, Option[User]]]

    正如标题所提到的 使用这样的数据结构有意义吗 我来一一解释一下 Future 代表异步计算 要么 传达已知错误 选项 传达该值可能不存在 看到这个的时候我有点害怕 使用这种类型组合是一个好的做法吗 让我们看一下解决方案空间 Success