F# 有异步验证库吗?

2024-04-18

我在代码中经常使用 asyncResult 但它会在第一个错误时退出:

asyncResult {

    let! a = allGood()
    let! b = thisReturnsError()
    let! c = neverExecuted()
}

但有时我想执行所有函数并总结错误:

validation {
    let! a = doSomething()
    and! b = doSomethingElse()
    and! c = andAnotherThing()
}

然后我要么得到一个“好的”,要么得到一个带有错误列表的错误。

这很棒,但我希望能够两者兼得!

asyncValidation {
    let! a = doSomethingAsync()
    and! b = doSomethingElseAsync()
    and! c = andAnotherThingAsync()
}

有一个库在做这个吗?


With F#+ https://github.com/fsprojects/FSharpPlus您可以通过使用来组合应用程序Compose:

#r @"nuget: FSharpPlus"

open FSharpPlus
open FSharpPlus.Data

// Generic applicative CE. At the moment not included in the library.
type ApplicativeBuilder<'a>() =
    inherit MonadFxStrictBuilder<'a>()
    member inline _.BindReturn(x, f) = map f x
let applicative<'t> = ApplicativeBuilder<'t> ()


let allGoodAsync () : Async<Validation<string, int>> = async { printfn "first success"; return Success 1 }
let thisResturnsErrorAsync () : Async<Validation<string, int>> = async { return Failure "thisReturnsError" }
let neverExecutedAsync () : Async<Validation<string, int>> = async { printfn "actually executed"; return Success 3 }

let x: Async<Validation<string, _>> =
    applicative {
        let! (a: int) = allGoodAsync () |> Compose
        and! (b: int) = thisResturnsErrorAsync () |> Compose
        and! (c: int) = neverExecutedAsync () |> Compose
        return a + b + c
        }
    |> Compose.run
let y = Async.RunSynchronously x

结果是

> 
first success
actually executed
val y: Validation<string,int> = Failure "thisReturnsError"

UPDATE

重新审视这个答案,可以进一步简化如下:

type ApplicativeBuilder2<'a>() =
    inherit Builder<'a>()
    member inline _.BindReturn(x, f) = map f x
    member inline _.Source x = Compose x
    member inline _.Run x = Compose.run x
let applicative2<'t> = ApplicativeBuilder2<'t> ()

所以你不需要搞乱Compose :

let x: Async<Validation<string, _>> =
    applicative2 {
        let! (a: int) = allGoodAsync ()
        and! (b: int) = thisResturnsErrorAsync ()
        and! (c: int) = neverExecutedAsync ()
        return a + b + c
        }

由于评论中提到的 F# 类型推断错误仍未修复,我现在可以说applicative and applicative2肯定会包含在 F#+ 的下一版本中。

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

F# 有异步验证库吗? 的相关文章

随机推荐

  • 在页面加载时从 JSP 文件调用 servlet

    我可以在不使用 HTML 表单的情况下从 JSP 文件调用 servlet 吗 例如 在页面加载期间在 HTML 表中显示数据库的结果 您可以使用doGet http docs oracle com javaee 7 api javax s
  • 如何让 Eclipse 显示 javax 注释的 Javadoc

    我真的很喜欢 Eclipse 为我使用的各种 Java 库类提供弹出式 Javadoc 文档的方式 不过 我也使用 JPA 和 JAXB 注释 例如 Entity 和 XMLType Eclipse 认为这些是有效的 因为我可以按 ctrl
  • HTTPResponse 对象 -- JSON 对象必须是 str,而不是“字节”

    我一直在尝试更新一个名为的小型 Python 库libpynexmo https github com marcuz libpynexmo使用 Python 3 我一直被这个功能困住了 def send request json self
  • 创建一个临时表并从中选择

    当我运行此命令时 出现错误 未声明的变量 temp
  • 调整组件大小时 JPanel 闪烁

    首先 我想澄清一下 我知道这个问题已经被问过很多次了 但是 我还没有找到对我有用的答案 我正在尝试制作一款需要分辨率的游戏 因此 我开始工作 使一个组件适应另一个组件的大小 同时保持纵横比 但我遇到了一个问题 那就是对象会发生某种轻弹或调整
  • 如何在 WebdriverIO 中单击 CTRL+M (Control + M)

    我必须发出一个CTRL MWebdriverIO 中的操作 但它不起作用 我尝试过使用不同的方法 例如 browser keys Control keys m browser keys Control KeyM NULL browser k
  • 如何为 HDFS 递归列出子目录?

    我在 HDFS 中递归创建了一组目录 如何列出所有目录 对于普通的 UNIX 文件系统 我可以使用以下命令来做到这一点 find path type d print 但我想为 HDFS 得到类似的东西 递归列出目录内容hadoop dfs
  • 仅绘制 y 轴,不绘制其他内容

    我想创建一个仅显示 y 轴 包括网格 数字和标签 的图 但我不想显示绘图或 x 轴 这可以吗 创建绘图时 您只需指定一些选项 特别要注意的是axes type and xlab plot runif 10 runif 10 xlim c 0
  • 如何在java中使用gson解码json字符串?

    我有一个json字符串 社交网络Qaiku的流 我怎样才能用Java解码它 我已经搜索过 但任何结果都对我有用 谢谢 对象反序列化的标准方法如下 Gson gson new Gson MyType obj gson fromJson jso
  • 为什么删除相关行 boot() 中的行不会被触发?

    在我的 Laravel 5 7 应用程序中 我有 2 个表 Tag TagDetail 一对一关系 第二个表将图像上传到存储和图像字段 我想使用引导方法自动删除相关行和图像 结果删除与 TagDetail 相关的 Tag 行被删除 但 Ta
  • 如何返回派生类型?

    我有一个 Validator 类及其派生类 当我尝试返回指向派生类的指针时 方法返回基类 验证器 而不是派生类 class Validator public std string m name BaseValidator static co
  • 对象类和数组 - 为什么它返回“null”? [java]

    我编写了一个小类 它创建一个包含 3 个数组的报表对象 在创建对象时 这些数组用值进行初始化 然而 当我测试该类以查看例如部门数组中的内容时 它会打印出数组元素为空 为什么 class Report declare instance var
  • 更新整数列中的特定位

    我有一个 mysql 表 其中用户权限存储为位掩码 user permissions Admin 31 User 13 16 8 4 2 1 Admin gt 1 1 1 1 1 gt 16 8 4 2 1 gt 31 User gt 0
  • android中的react-native-snap-carousel上手动水平滚动的问题

    我正在使用react native snap carousel来显示横幅 它在 iOS 中的手动滚动和间隔后自动滚动都运行良好 但在 Android 中手动滚动时面临两个问题 对于某些设备 特别是三星 它会卡在第三个索引处 手动完成时 但自
  • 在 Mac 上开发 .Net 应用程序? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是 Net 开发人员 开始使用 Mac OS 我在这个系统上唯一怀念的是 VISUAL STUDIO 我不想使用两个系统 你认为如何开发 Ne
  • Impala 表中的压缩

    我想了解 Impala 表中的压缩 但找不到可供研究的材料 有哪些不同的技术以及我在哪里可以找到研究它的材料 主要技术为compaction是为了避免small file problem这取决于您的用例 例如 您可能有一个将小文件写入的进程
  • 函数式 GUI 编程可能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我最近发现了 FP bug 试图学习 Haskell 到目前为止所看到的东西给我留下了深刻的印象 一流的函数 惰性求值和所有其他好处 我还不是专
  • Jfrog CLI 不尊重配置的 API 密钥

    我正在使用 Powershell DSC 设置 Windows Server 2012 R2 盒子 作为配置过程的一部分 我将配置 jfrog exe 并作为服务帐户执行配置命令 jfrog rt config url localArtif
  • 读取 WCF 消息正文两次 - “消息无法读取”

    我有一个 WCF 消息 Channels Message 我正在尝试使用 GetBody 提取正文 但是 我注意到我只能执行一次 如果我尝试再次使用 GetBody 我会收到 此消息无法支持该操作 因为它已被读取 知道如何重新阅读邮件正文吗
  • F# 有异步验证库吗?

    我在代码中经常使用 asyncResult 但它会在第一个错误时退出 asyncResult let a allGood let b thisReturnsError let c neverExecuted 但有时我想执行所有函数并总结错误