将面向铁路的故障跟踪转换为 Rx 友好错误

2023-12-29

我正在使用一个库,它将结果作为双轨值(成功和失败)。Observable.map函数体我经常从函数的成功跟踪中得到可观察的结果,但我不知道如何处理它们(在Observable.map body).

换句话说,我经常陷入结果如下所示的情况(当然这是最简单的):

Rop.Result<IObservable<Rop.Result<IObservable,Messages>,Messages>

一方面,将消息转换回异常并引发它们似乎对我来说很重要,另一方面,错误处理程序是不纯的函数,我宁愿不传递它们。

我想知道处理双轨结果失败的标准和干净的解决方案是什么Observable.map body.

更新:示例

这是该问题最简单的示例:

module problem
open FSharp.Control.Reactive

type Person = {FirstName:string;LastName:string}

let getPersonByLastName lastName =

    let persons =   Observable.toObservable<|seq{
            yield {FirstName="Jhone";LastName="Smith"}
            yield {FirstName="Joe";LastName="Smith"}
            yield {FirstName="Jack";LastName="Smith"}
            }

    Rop.succeed persons

let main =
  let final =
    Observable.single("Smith")
    |>Observable.map(fun lastName -> 
                    let personResults = getPersonByLastName lastName
                    personResults
                    )

  0

在这个例子中final表达式的结果是类型IObservable<Result<IObservable<Person>,ErrorMessage list>>但我希望它是IObservable<Person>,因为进一步Observable转换最终会得到非常肮脏和复杂的表达式。


在最简单的层面上,您需要的是一种提取然后呈现的方法IObservable包裹在一个RopResult。评论中已经提到了解决方案的一部分(Observable.bind),另一个是函数RopResult<IObservable<'a>, 'b> -> IObservable<RopResult<'a,'b>>.

为此,您需要解构RopResult并处理这两种情况。因此,将其放在您所说的问题的背景下:

Observable.single("Smith")
|>Observable.bind(fun lastName -> 
    match getPersonByLastName lastName with
    | Rop.RopResult.Success (next, msgs) -> 
        next |> Observable.map (fun x -> Rop.RopResult.Success (x, msgs))
    | Rop.RopResult.Failure msgs ->
        Observable.result <| Rop.RopResult.Failure msgs)

这是好的代码吗?我不这么认为。您可以通过使用其他 ROP api 函数,或者通过在此处使用绑定主体的计算表达式来使其稍微好一点,但这不是重点。

使用 Observables 的反应式编程和“面向铁路的编程”都是有用的工具,只要它们能够捕获和抽象出您正在建模的任何计算中涉及的一些复杂元素。这是可行的,因为它们是建立在可以很好地组合在一起的基元之上的。当您尝试像这样“交织”两者时,您会失去一些,因为您必须自己管理该构图。

我会说你最好使用异常 https://eiriktsarpalis.wordpress.com/2017/02/19/youre-better-off-using-exceptions这里 - 特别是因为 Observables 对它们有内置的支持。

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

将面向铁路的故障跟踪转换为 Rx 友好错误 的相关文章

  • 如何在 Perl 中以函数式风格进行编码?

    你如何 have a sub返回一个sub or 将文本作为代码执行 in Perl 另外 如何拥有匿名函数存储状态 子返回子作为coderef example 1 return a sub that is defined inline s
  • 使用 Rx 运行周期性任务并具有单个并发执行限制的好方法是什么?

    我想运行周期性任务 但有一个限制 在任何给定时间最多只能运行一个方法的一次执行 我正在尝试 Rx 但我不确定如何施加最多一次并发限制 var timer Observable Interval TimeSpan FromMillisecon
  • F# 类型提供程序与 Lisp 宏

    我一直在阅读有关 F 3 0 类型提供程序的内容 例如here http msdn microsoft com en us library hh156509 aspx 并且它们似乎基于一种编译时代码生成 在这方面我想知道它们与 Lisp 宏
  • 什么样的函数被认为是“可组合的”?

    维基百科文章函数组合 计算机科学 https en wikipedia org wiki Function composition computer science says 就像数学中通常的函数组合一样 每个函数的结果作为下一个函数的参数
  • F# 正确使用序列缓存

    我正在尝试将 Seq cache 与我制作的函数一起使用 该函数返回最多为 N 的素数序列 不包括数字 1 我无法弄清楚如何将缓存的序列保留在范围内 但仍然使用它在我的定义中 let rec primesNot1 n 2 n gt Seq
  • F# nameof 运算符不是一等函数

    我正在使用 F 4 7
  • 将属性应用于返回值 - 在 F# 中

    在 C 中 可以将属性应用于方法的返回 return DynamicAttribute public object Xyz return new ExpandoObject 这在 F 中可能吗 背景 我想要一个用 F 编写的库的方法 该方法
  • 将 C# 代码转换为 F#(if 语句)

    我想知道如何转换此代码逐行从 C 到 F 我不想使用任何类型的 F 习惯用法或类似的东西 我想了解如何直接映射C 的构造到 F 这是 C 代码 requires l Length gt 0 int GetMinimumValue List
  • Vim 脚本中的“reduce”函数

    Vim 脚本有一些非常基本的函数式编程工具 It has map and filter 但据我所知它缺乏reduce 功能 Reduce https en wikipedia org wiki Fold 28higher order fun
  • 正确使用术语 Monoid

    从下面的例子来看 我认为这样的说法是正确的String在串联运算下定义了一个幺半群 因为它是关联二元运算 并且String碰巧有一个身份元素 它是一个空字符串 scala gt Jane Doe Jane Doe res0 Boolean
  • std::bind 重载解析

    下面的代码工作正常 include
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 如何在不改变也不重新分配的情况下实现可设置和可检索的状态?

    编写代码时可以遵循以下几条规则 当没有重新分配时 代码更容易阅读和推理 许多 linter 推荐首选const只要有可能 代码也更容易阅读和推理对象何时不会发生变化 如果您在代码的一部分中定义了一个对象 那么知道您可以在其他地方自由引用该对
  • 如何从引用的表达式匹配中获取模块、函数等的 F# 名称

    我继续开发 F 引用表达式的打印机 它不一定是完美的 但我想看看有什么可能 中的活跃模式Microsoft FSharp Quotations Patterns and Microsoft FSharp Quotations Derived
  • 快速重复 TakeWhile 导致无限循环

    如何使以下可观察的重复 直到stream DataAvailable为假 目前看来它永远不会停止 Defer 部分内的 AsyncReadChunk 和 Observable Return 进行 OnNext 调用 然后进行 OnCompl
  • 卷积函数可以写成尾递归形式吗?

    我有一个函数 我想以尾递归形式编写 该函数计算求和的方法数k通过滚动s双面模具n次 我已经在上面看到了这个函数的数学解这个答案 https math stackexchange com questions 397689 why convol
  • 使用不区分大小写的比较从集合中减去记录

    我有一组记录 type Person Name string Age int let oldPeople set Name The Doctor Age 1500 Name Yoda Age 900 与上面的硬编码示例不同 这组数据实际上来
  • 自定义 monad 的 MonadTransControl 实例

    的文档monad control提供有关如何创建实例的示例MonadTransControl using defaultLiftWith and defaultRestoreT 该示例适用于以下情况newtype newtype Count

随机推荐

  • PHP 文件形式的图像

    我对 PHP 相当陌生 我需要知道如何将文件显示为图像 例如 打开http example com script php http example com script php将显示图像 我的理由是我需要把它放在src的属性 img 我希望
  • 获取 Unicode 字符中字符串的“实际”长度

    给定一个像 xe2 x9c xae 例如 可以是其他类似 or 我想找到字符打印在屏幕上时的 实际 长度 例如 len len xe2 x9c xae 两者都返回 3 但它应该是 1 你可以这样尝试 unicodedata normaliz
  • 在 Python 中编译正则表达式

    我正在阅读 Doug Hellman 的 Python 标准库示例 并发现了这一点 1 3 2 编译表达式 re 包含用于将正则表达式作为文本字符串处理的模块级函数 但更有效的是compile程序经常使用的表达式 我无法理解他对为什么会出现
  • 当单选按钮在 Jquery mobile 中处于活动状态时,单选按钮上有不同的颜色

    我有三个单选按钮 它们在 jquery 中具有相同的主题 如果我选择其中之一 按钮的颜色将更改为 css 中的 ui btn active 类中指定的颜色 我的单选按钮名为 可以见面 不确定 和 拒绝 我希望 拒绝 单选按钮在被选中时具有与
  • 将整个页面替换为 ajax 加载页面的内容

    我正在使用 JQuery 并且试图找到一种用 ajax 加载的内容替换整个页面的方法 我找到了建议如何从加载页面执行此操作的答案 但如果可能的话 我想从加载页面执行此操作 我有一个使用大量 ajax 调用的网络应用程序 问题是 如果用户在这
  • 高斯曲线拟合算法

    各位 我一直在尝试获得一些数据集的高斯拟合 这些数据集在某种程度上看起来像扭曲的正态分布 我一直在使用软件来做到这一点 我想知道是否可以应用迭代算法将这些数据集转换为高斯拟合曲线 原始曲线的标准差和平均值作为输入 有任何想法吗 计算数据的平
  • 查找未设置该属性的Neo4j节点

    使用Cypher 如何找到不存在属性的节点 例如我有两个节点 A foo true name A B name B 现在我想找B 在没有的基础上选择它foo属性集 我怎样才能做到这一点 正如迈克尔 饥饿提到的 MATCH n WHERE N
  • HTTP 中的“406-不可接受的响应”是什么?

    在我的 Ruby on Rails 应用程序中 我尝试通过 POSTMAN 上传图像REST http en wikipedia org wiki Representational State Transfer客户在Base64 http
  • 为什么在 docker 中拉取镜像时出现此错误

    我尝试使用以下方法提取图像 docker pull ghcr io linuxserver nextcloud latest 但我收到此错误消息 来自守护进程的错误响应 获取 https ghcr io v2 拨打 tcp 在 1 53 上
  • 将条纹样式添加到项目列表

    使用 KnockoutJS 对列表进行条带化的最佳方法是什么 下面的 div 上的类应该是偶数或奇数 具体取决于它在列表中的位置 并在添加或删除项目时更新 div class Headlines loader div
  • Xamarin 的 Genymotion Android 模拟器

    我在使用 Genymotion Android 模拟器进行 xamarin 开发时遇到问题 我已经安装了 Genymotion 桌面应用程序和其中的几个 Android 设备 每当我通过 Genymotion 桌面应用程序运行任何已安装的设
  • 原型混乱:父原型属性受子原型影响

    我正在读一本关于 OOP javascript 的书 并被其中一个示例困住了 在示例代码的第一个版本中 一个新实例Shape构造函数被创建并且toString方法被调用 这toString方法返回 三角形 这是name的财产Triangle
  • 为什么 write.csv 和 read.csv 不一致? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Android 中手动重新排序 ListView?

    我在 Android 中有一个 ListView 需要能够手动重新排序 Android 的音乐播放器应用程序就是一个示例 您可以更改播放列表中曲目的顺序 我知道如何以编程方式更改 ListView 的顺序 但不知道如何在音乐播放器应用程序中
  • 如何发送PDF文件到前端?

    我的系统上有一个保存的 PDF 文件 我正在尝试使用 node express 将文件发送到前端 我正在将文件作为流 二进制字符串 发送到前端 但是当在前端运行一些代码以将 PDF 下载到用户计算机上时 PDF 文件显示为空白 这是我在服务
  • 在 Spark 中对多个 DataFrame 执行 join

    我有 3 个由 3 个不同进程生成的数据帧 每个数据框都有相同名称的列 我的数据框看起来像这样 id val1 val2 val3 val4 1 null null null null 2 A2 A21 A31 A41 id val1 va
  • 如何在 postgres 数据库上切换两个 ID [PK]?

    我想更改 Postgres 上两行的 ID 以切换它们 它们已经被定义为外键 所以我不能使用第三个数字来进行切换 如何在一个 SQL 查询或事务中执行此操作 Example UPDATE mytable SET id 2 WHERE ID
  • DateTime.AddDays() 未按预期工作

    我有这个简单的程序 DateTime aux new DateTime 2012 6 12 12 24 0 DateTime aux2 new DateTime 2012 6 12 13 24 0 aux2 AddDays 1 Consol
  • 在 Rails cookie 中存储/检索值

    我创建了一个 SessionHelper 模块 它看起来或多或少像这样 module SessionHelper def create cookie cookies signed token value gt expires gt 1 ho
  • 将面向铁路的故障跟踪转换为 Rx 友好错误

    我正在使用一个库 它将结果作为双轨值 成功和失败 Observable map函数体我经常从函数的成功跟踪中得到可观察的结果 但我不知道如何处理它们 在Observable map body 换句话说 我经常陷入结果如下所示的情况 当然这是