重试 F# 中的计算表达式或其他构造

2023-12-25

我希望能够在 F# 中编写一个计算表达式,以便在抛出异常时能够重试操作。现在我的代码如下所示:

let x = retry (fun() -> GetResourceX())
let y = retry (fun() -> GetResourceY())
let z = retry (fun() -> DoThis(x, y))
etc. (this is obviously an astract representation of the actual code)

我需要能够将每个函数重试一定次数,这是我在其他地方定义的。

我认为计算表达式可以在这里帮助我,但我不知道它如何帮助我删除将每个右侧显式包装到 Retryable

我可以看到计算表达式看起来像这样:

let! x = Retryable( fun() -> GetResourceX())
etc.

我知道 Monad 从粗略的角度来说是包装类型,但我希望有一种解决方法。我知道我可以重载一个运算符,并有一个非常简洁的语法来将操作转换为 Retryable,但对我来说,这只是使重复/包装更加简洁;它还在那里。我可以将每个函数包装为 Retryable,但我再一次看不到执行帖子顶部所做操作的价值(对每个操作调用重试。至少它非常明确)。

我不确定,计算表达式在这里可能是错误的抽象。关于这里可以做什么有什么想法吗?


计算表达式有一些扩展(除了标准的一元功能之外),这为您提供了一种很好的方法来做到这一点。

正如你所说,单子本质上是包装器(创建例如Retryable<'T>)有一些额外的行为。然而,F#计算表达式也可以定义Run自动解包该值的成员,因此结果retry { return 1 }可以只有一个类型int.

这是一个示例(构建器如下):

let rnd = new System.Random()
// The right-hand side evaluates to 'int' and automatically
// retries the specified number of times
let n = retry { 
  let n = rnd.Next(10)
  printfn "got %d" n
  if n < 5 then failwith "!"  // Throw exception in some cases
  else return n }

// Your original examples would look like this:
let x = retry { return GetResourceX() }
let y = retry { return GetResourceY() }
let z = retry { return DoThis(x, y) }

这是的定义retry建设者。它并不是真正的单子,因为它没有定义let!(当您使用使用创建的计算时retry在另一个retry块,它只会根据需要重试内部一次 X 次和外部一次 Y 次)。

type RetryBuilder(max) = 
  member x.Return(a) = a               // Enable 'return'
  member x.Delay(f) = f                // Gets wrapped body and returns it (as it is)
                                       // so that the body is passed to 'Run'
  member x.Zero() = failwith "Zero"    // Support if .. then 
  member x.Run(f) =                    // Gets function created by 'Delay'
    let rec loop(n) = 
      if n = 0 then failwith "Failed"  // Number of retries exceeded
      else try f() with _ -> loop(n-1)
    loop max

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

重试 F# 中的计算表达式或其他构造 的相关文章

  • F# 中的动态编程

    实现解决问题的动态规划算法的最优雅的方法是什么子问题重叠的问题 http en wikipedia org wiki Overlapping subproblem 在命令式编程中 人们通常会创建一个按问题大小索引的数组 至少在一维 然后算法
  • F# 中的自定义路由事件

    我正在尝试翻译这段 C 代码 https msdn microsoft com en us library ms752288 aspx 到目前为止我的尝试 type MyButtonSimple as self inherit Button
  • 如何从 C# 可移植类库 (PCL) 添加对 F# 可移植库的引用

    我有一个项目 其中包含两个 F 项目和一个 C 项目 我想在其中编写一些 XUnit 测试 FS PL F 3 1 3 3 1 0 可移植库 FS PL Legacy F 31 2 3 5 1 可移植库 旧版 测试 C NET 4 5 Wi
  • 基于函数签名的模式匹配

    在 F 中 您可以对函数签名进行模式匹配 我想用一个函数来装饰多个函数 该函数测量函数的执行情况并调用 statsd 我当前的功能是 let WrapFunctionWithPrefix metrics Metric Client IRec
  • 如何从 f# 返回一个空元组到 c#? [复制]

    这个问题在这里已经有答案了 我有这个类型正确的 C 函数 static System Tuple
  • 如何忽略异步块中异步函数的返回值?

    The m1 and m2以下函数中存在编译错误 let m p async return p 2 let m1 async do m 2 ERR was expected int but here has type unit let m2
  • 如何让一条记录实现一个接口?

    如果我有一个界面 type IData abstract member firstName string abstract member lastName string 如何定义符合此接口的记录类型 我尝试了如下所示 gt type Dat
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • F# 核心库源代码有一个用于将元组编译为结构的标志,但我无法使其工作

    这是后续问题这个提议 https fslang uservoice com forums 245727 f language suggestions 6148669 short tuples compiled as structs up t
  • 如何在 F# 中打印整个列表?

    当我使用 Console WriteLine 打印列表时 它默认仅显示前三个元素 如何让它打印列表的全部内容 您可以将 A 格式说明符与 printf 一起使用来获得 美化的 列表打印输出 但与对象上的 Console WriteLine
  • 什么时候需要使用 new 来初始化 F# 类型?

    给定一个类 例如 type MyClass member this Greet x printfn Hello s x 使用初始化实例是否合适 let x new MyClass 或没有new 另外 什么时候使用new构造函数比 a 更有用
  • 生成尾调用操作码

    出于好奇 我尝试使用 C 生成尾部调用操作码 斐波那契数很简单 所以我的 C 示例如下所示 private static void Main string args Console WriteLine Fib int MaxValue 0
  • 专家 f# 脚本编译奇怪

    第 209 210 页有一个扩展示例 见下文 我使用的是 F 4 5 总之 我不明白的是 如果我单独键入每个语句 则会有一个声明引发错误 如果我立即提交整个脚本 以及引发错误的声明之后的函数 则一切正常 那么 当我批量提交所有语句时 交互中
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • 使用列表匹配绑定值(没有编译器警告)

    假设我有一个需要一些时间的函数int参数 但在其中我将使用float32 我不想使用float32 i无处不在的功能 相反 我想这样做 let x float32 x let y float32 y let w float32 w let
  • 如何在 F# 中使用 LINQ 更新数据库中的表?

    我看过很多有关如何查询数据库的示例 但没有看到有关如何更新记录的示例 下面是我编写的用于检索表的简单代码 但有人可以解释一下如何修改字段 例如lastActiveDate 并更新数据库上的表 谢谢你 周日 open System open
  • 是否可以在 F# 类型提供程序中使用 System.Type 作为静态参数?

    我想知道是否可以使用 System Type 作为 F 类型提供程序中的静态参数 以便我可以编写如下内容 type HelperType HelperProvider
  • 我可以提供类型作为 F# 中类型提供程序的输入吗?

    这样做有什么我应该注意的陷阱吗 您知道处理我可能遇到的相同 pb 的现有代码吗 Thks 不幸的是 您无法将类型作为静态参数传递给类型提供程序 使用传递的静态参数MyProvider lt first argument 42 gt 必须是原
  • 如何向 F# 项目添加第三方 dll 引用?

    我正在向我的 F 项目添加第三方 dll 引用 我在引用中添加了 dll 当我使用它时 即突出显示代码并执行 Alt Ent 我收到错误 命名空间或模块 AZROLESLib 未定义 我是不是错过了什么 简而言之 你必须使用 r path
  • F# 如何标记用户输入:分隔数字、单位、单词?

    我对 F 相当陌生 但最近几周一直在阅读参考资料 我希望处理用户提供的输入字符串 识别并分隔组成元素 例如 对于此输入 XYZ 酒店 6 晚 220 欧元 晚 加17 5 的税 输出应该类似于元组列表 XYZ 字 酒店 字 6 数字 夜晚

随机推荐

  • React 和 babel 中的可选链接运算符

    在我的项目中我配置 babel presets react es2015 stage 1 transform optional chaining plugins transform runtime 这是我的devDependencies i
  • 如何一次运行多种语言的 tesseract?

    我必须分析包含英语和日语文本的图像 当我默认运行 tesseract 时 l eng 一些日语字符丢失了 否则 如果我用日语运行 tesseract l jpn 一些英文字符丢失 例如电子邮件 如何运行一个同时识别英语和日语字符的进程 从
  • dlopen 与链接开销

    假设我有一个库 foo so 当构建我的二进制文件 需要这个库 时 我可以 1 链接 foo so 或者 2 在程序源代码中 dlopen 这个库 然后调用这个库提供的函数 当我从库中调用函数时 1 和 2 之间有性能差异吗 请注意 我知道
  • 为什么 VB 中的 lambda 表达式与 C# 中不同?

    我刚刚在 NHibernate 中遇到了一个错误 该错误恰好已经被提出 https nhibernate jira com browse NH 2763 https nhibernate jira com browse NH 2763 我不
  • 将 duff 的设备从 C 移植到 JavaScript

    我有这种 Duff 的 C 语言设备 它工作正常 将文本格式设置为金钱 include
  • 带有 IIS 的 Kestrel - 运行时缺少 libuv.dll

    我们正在设置一个现有的 Web API 服务器 以便与现有的 API 一起为站点提供服务 我一直在松散地关注本文 http miniml ist dotnet how to serve a static site plus a web ap
  • 解析 WSDL 的简单方法

    我正在尝试解析 WSDL 以获取操作 端点和示例有效负载 用户输入的 WSDL 我找不到执行此操作的教程 我只能找到生成我不需要的源代码的那些 我尝试过使用 XBeans 但显然我需要 Saxon 有没有一种简单的轻量级方法可以在没有 Sa
  • 我如何处理异常?

    Angular 有一个很棒的 异常处理程序 https docs angularjs org api ng service 24exceptionHandler React js 有类似的东西吗 我想将我的错误记录到外部 API 例子 ht
  • SoundCloud track.stream_url 对某些曲目不起作用

    我注意到在 soundcloud 上的某些曲目上 stream url 指向 404 页面未找到 该曲目已设置为可流式传输 但流式传输 URL 仍然不起作用 这是一个例子 http api soundcloud com tracks 129
  • 向 R 绘图添加类似 Excel 功能的方法? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我一直在研究 R 图形参数 试图让我
  • 使用Intellij IDEA重新加载远程Spring Boot应用程序时出现异常

    我正在尝试使用 spring 设置远程 spring boot 环境devtools http docs spring io spring boot docs current reference html using boot devtoo
  • 将 SharePoint 列表数据提取到单独的 SQL Server 表的最简单方法?

    Edited What is the easiest way to scrape extract SharePoint list data to a separate SQL Server table One condition you r
  • wkhtmltopdf - 背景颜色未填充第二页

    我正在尝试使用 wkhtmltopdf 将 HTML 转换为 PDF 文档 我正在运行的命令是wkhtmltopdf test html test pdf 软件版本 wkhtmltopdf V wkhtmltopdf 0 12 5 with
  • php exec 命令(或类似命令)不等待结果

    我有一个想要运行的命令 但我不希望 PHP 坐等结果 是否可以让 PHP 不等待结果 即只是启动它并继续执行下一个命令 我找不到任何东西 并且不确定它是否可能 我能找到的最好的办法就是有人在一分钟内开始执行 CRON 工作 来自文档 htt
  • 仅在基于范围的循环中迭代奇数(偶数)元素

    假设我们有一个普通数组 或其他支持基于范围的循环的容器 const int N 8 int arr N 0 1 2 3 4 5 6 7 使用索引或迭代器 我们可以循环奇数元素并将索引增加 2 for int i 0 i lt N i 2 s
  • 在 noUISlider 中格式化工具提示

    我在我的 Rails 项目中使用 noUISlider noUiSlider create slider start 3 connect lower step 1 range min 1 max 9 pips mode steps dens
  • 如何设置 GOPRIVATE 环境变量

    我开始研究一个Go项目 它使用来自 Github 私有存储库的一些私有模块 每当我尝试运行时go run main go它给了我一个下面的410 Gone error 验证 github com repoURL 电子邮件受保护 cdn cg
  • Google 的 XSLT 页面索引

    我的网站是使用 XML 作为数据存储并使用 XSLT 作为模板创建的 看来 Google 不太擅长为基于 XML XSLT 的网站建立索引 是否有任何高效 易于实现的软件组件可以仅为 Google bot 索引器呈现 XSLT 如果他们使用
  • 去掉6位数后的经纬度小数部分

    我以这种格式得到纬度和经度 纬度23 132679999999997 经度72 20081833333333 但我想要这种格式 纬度 23 132680 经度 72 200818 我怎样才能转换 double Latitude 23 132
  • 重试 F# 中的计算表达式或其他构造

    我希望能够在 F 中编写一个计算表达式 以便在抛出异常时能够重试操作 现在我的代码如下所示 let x retry fun gt GetResourceX let y retry fun gt GetResourceY let z retr