如何构建一个累积的任一构建器

2024-01-10

我想为这两个表达式构建一个计算表达式。 这很简单

type Result<'TSuccess> = 
| Success of 'TSuccess
| Failure of List<string>

type Foo = {
    a: int
    b: string
    c: bool
}

type EitherBuilder () =
    member this.Bind(x, f) = 
        match x with
        | Success s -> f s
        | Failure f -> Failure f

        member this.Return x = Success x

let either = EitherBuilder ()

let Ok = either {
    let! a = Success 1
    let! b = Success "foo"
    let! c = Success true
    return 
        {
             a = a
             b = b
             c = c
        }
}

let fail1 = either {
    let! a = Success 1
    let! b = Failure ["Oh nose!"]
    let! c = Success true
    return 
        {
             a = a
             b = b
             c = c
        }
    } //returns fail1 = Failure ["Oh nose!"]

但在失败(多次)的情况下,我想累积这些并返回失败,如下所示。

let fail2 = either {
    let! a = Success 1
    let! b = Failure ["Oh nose!"]
    let! c = Failure ["God damn it, uncle Bob!"]
    return 
        {
             a = a
             b = b
             c = c
        }
    } //should return fail2 = Failure ["Oh nose!"; "God damn it, uncle Bob!"]

我有一个关于如何通过重写来做到这一点的想法Bind并且总是回来Success(尽管有一些额外的结构表示累积的错误)。但是,如果我这样做,那么我会错过停止信号,并且我总是会返回返回值(实际上并不是因为我会遇到运行时异常,但原则上)


我认为你想要做的事情不能用单子来表达。问题是Bind如果可以获取函数参数的值,则只能调用其余的计算(这可能会产生更多失败)。在你的例子中:

let! a = Success 1
let! b = Failure ["Oh nose!"]
let! c = Failure ["God damn it, uncle Bob!"]

绑定无法调用以以下开头的延续b因为Failure ["Oh nose!"]不提供价值b。您可以使用默认值并将错误保留在一边,但这会改变您正在使用的结构:

type Result<'T> = { Value : 'T; Errors : list<string> }

您可以使用应用函子抽象来编写此代码,您需要:

Merge  : F<'T1> * F<'T2> -> F<'T1 * 'T2>
Map    : ('T1 -> 'T2) -> M<'T1> -> M<'T2> 
Return : 'T -> M<'T>

您可以通过以下方式实现所有这些Merge累积错误(如果两个参数都表示失败)并且Map仅当没有值时才应用计算。

在 F# 中对应用函子进行编码有多种方法,但没有合适的语法,因此您很可能最终会使用丑陋的自定义运算符。

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

如何构建一个累积的任一构建器 的相关文章

  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 在 Deedle 系列中算得上独一无二

    我想对我的数据框中的系列有一个概述 例如 pandas 的唯一值计数 我不知道是否有内置函数可以实现这一点 到目前为止 我已经完成了一个函数来获取不同特征的数量 我可以设法完成这项工作 我的问题只是关于内置功能 let unique s D
  • F# 中的数组初始化

    如何根据给定的记录类型在 F 中创建和初始化数组 假设我想创建一个包含 100 个 record1 记录的数组 e g type record1 value1 string value2 string let myArray Array i
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 使用不区分大小写的比较从集合中减去记录

    我有一组记录 type Person Name string Age int let oldPeople set Name The Doctor Age 1500 Name Yoda Age 900 与上面的硬编码示例不同 这组数据实际上来
  • 带表达式的 F# 类型定义

    是否可以这样表达 type id int gt 0 我知道它不可能静态执行 因为这意味着 F 具有依赖类型 在 C 中 我习惯于使用代码契约来执行此类操作并获得运行时强制执行 我正在这里寻找类似的东西 Thanks 编辑 感谢您提供的所有答
  • F# 和 MEF:导出函数

    因此 我试图在 F 控制台应用程序中运行这个简单的测试 open System Reflection open System ComponentModel Composition open System ComponentModel Com
  • F# 中的选项类型如何工作

    因此 我一直在阅读 Apress 的 Expert F 书籍 主要将其用作构建玩具式 F 库时的参考 但有一点我未能掌握 那就是 Option 类型 它是如何工作的以及它在现实世界中的用途是什么 选项类型至少为similar to Null
  • 合并具有公共字段的列表的最快方法?

    我正在学习 F 并且正在做赔率比较服务 ala www bestbetting com 以将理论付诸实践 到目前为止 我有以下数据结构 type price Bookie string Odds float32 type selection
  • 如何从 f# 返回一个空元组到 c#? [复制]

    这个问题在这里已经有答案了 我有这个类型正确的 C 函数 static System Tuple
  • 如何使用 WebSharper 在服务器上生成 Google Visualizations 数据

    我的目标是能够在服务器上为 Google Visualizations 生成数据 然后将其作为 java 脚本传递给客户端 以便可以将其呈现为折线图 我下面的示例可以正确编译 但在浏览器中呈现时会产生错误 在服务器上构建 DataCommo
  • 在构建过程中引用自身内部的记录

    我正在尝试创建一条记录 该记录在同一构造函数中使用先前定义的字段之一来计算另一个字段的值 例如 myRecordType Foo int Bar int myRecord Foo 5 Bar Array init Foo fun i gt
  • 专家 f# 脚本编译奇怪

    第 209 210 页有一个扩展示例 见下文 我使用的是 F 4 5 总之 我不明白的是 如果我单独键入每个语句 则会有一个声明引发错误 如果我立即提交整个脚本 以及引发错误的声明之后的函数 则一切正常 那么 当我批量提交所有语句时 交互中
  • 您将如何在 F# 中解决这个问题? (高频传感器数据)

    我是一名机械工程研究生 我的导师刚刚要求我为我们的一个传感器项目编写一个数据可视化实用程序 由于现在是夏天 他希望我能从中获得一些乐趣 我认为这将是学习一门擅长科学计算的语言的好时机 所以我直接开始学习 F 由于我是函数式编程范例的新手 因
  • F# 生成日期序列/数组

    在 F 中我可以轻松做到 let a 1 10 那我为什么不能做 let a DateTime Parse 01 01 2012 let b DateTime Parse 01 01 2020 let dateList a b 它给出了一个
  • 如何在 F# 中使用 LINQ 更新数据库中的表?

    我看过很多有关如何查询数据库的示例 但没有看到有关如何更新记录的示例 下面是我编写的用于检索表的简单代码 但有人可以解释一下如何修改字段 例如lastActiveDate 并更新数据库上的表 谢谢你 周日 open System open
  • 如何在 F# 中组合 Result<> 列表?

    用这个代码 let a 3 4 5 6 7 let check x if x 2 0 then Ok x else Error x let b a gt List map check 我如何将 B 总结为 如果一切OK 则Ok 如果有任何错
  • 使用异步工作流程并行化的最佳实践

    假设我想抓取一个网页并提取一些数据 我很可能会写这样的东西 let getAllHyperlinks url string async let req WebRequest Create url let rsp req GetRespons
  • 如何在 F# 中执行 Seq.takeWhile + 一项

    我想编写一个使用谓词过滤序列的函数 但结果还应该包括谓词返回 false 的第一个项目 如果 F 中有一个break关键字 逻辑将是这样的 let myFilter predicate s seq for item in s do yiel
  • 如何向 F# 项目添加第三方 dll 引用?

    我正在向我的 F 项目添加第三方 dll 引用 我在引用中添加了 dll 当我使用它时 即突出显示代码并执行 Alt Ent 我收到错误 命名空间或模块 AZROLESLib 未定义 我是不是错过了什么 简而言之 你必须使用 r path

随机推荐

  • 当宏以与宏后面的字符串相同的字符结尾时,使 m4 看到宏

    我正在开发一个使用 M4 扩展一些文件的系统 但在某些情况下我遇到了扩展问题 定义 宏命名的约定 如果可能的话我不想改变 是
  • PyStan API 中的变分推理?

    我在其中找不到任何提及变分推理的内容PyStan 文档 https pystan readthedocs org en latest api html 尽管它已添加 http arxiv org abs 1506 03431在斯坦本身 我是
  • 在 mex 上使用整数数组

    我想将一个整数数组从 MATLAB 传递到 C 我尝试过使用 uint64 T 类型 但它总是崩溃 使用 mxGetPr 获取双指针工作正常 但我需要将内容类型转换为整数 并且在每次迭代中这样做可能会很慢 我在 mexFunction 中尝
  • 将 KeyDown 事件(按键)连接到一个 C# (wpf) 字符串

    我有一个磁卡读卡器 它使用键盘输入发送数据 我正在使用 KeyDown 事件来获取此对象 C WPF KeyEventArgs e 我想把我得到的钥匙做成一串 我尝试连接e Key ToString 但这不起作用 我的输入有很多数字和符号
  • 为什么我的 Google Actions Alpha 版本没有出现在 Google Assistant 商店中?

    在我的开发者帐户中 我可以使用模拟器成功测试应用程序 我也成功部署了Alpha版本 等了24小时 但是 那opt in链接不起作用 每次我导航到它时 我都会看到 We can t find what you re looking for a
  • MongoDB - 如何根据部分字符串查找不同的值

    我不确定这是否可能 但我想从 Mongo 不同方法中的 url 获取不同的域名 这是一些示例数据 stuff someValue moreStuff someOtherValue url http mydomain prep com pos
  • django Rest框架中的过滤

    在我的项目中 我使用 django Rest 框架 为了过滤结果 我使用 django filters 后端 有我的代码 模型 py from django db import models class Region models Mode
  • phpMyAdmin 无法在 PHP5.5.8 的 CentOS 6.5 上运行

    我有一台运行 nginx 1 0 15 PHP FPM FastCGI 5 5 8 和 MySQL 5 5 35 的 CentOS 6 5 x64 服务器 我已经安装了 phpMyAdmin 4 1 5 并配置了一个 nginx 虚拟主机
  • Laravel:注册表单打开时会话过期

    我有一个网络应用程序正在以信息亭模式等待笔记本电脑上的用户 有时 注册失败并且用户会看到错误屏幕 我认为是 419 会话已过期 因此 我假设登录屏幕加载两小时后 会话就会过期 我保留了默认值 120 分钟 config session ph
  • 使用 TerminateProcess 终止“mstsc.exe”进程时出现错误代码(5) 访问被拒绝

    我用CreateProcess 使用 mstsc exe 启动 rdp 客户端应用程序的函数 之后 我想终止它 所以我使用TerminateProcess 函数 但它失败 错误代码为 5 如果我用 notepad exe 替换 mstsc
  • 活动管理员允许的参数

    有没有办法从活动管理的 Permit params 块内部判断我是处于创建模式还是编辑模式 当我创建新记录时 我想合并created by和updated by 当我编辑现有记录时 我只想合并updated by 这是我的代码 Active
  • 如何对 Spring @Bean CommandLineRunner 进行单元测试?

    我在一个小型 PoC 中使用 Spring Boot 并且正在尝试测试 Bean 实现 我有这个代码 SpringBootApplication public class Application public static void mai
  • 从R中的alphahull中提取多个多边形

    我正在使用 alphahull 创建地图边界 结果有时是离散的船体 这很好 下面示例中的三个漂亮的集群 我可以使用 igraph 获取离散簇的数量 但我想关闭多边形 并且没有看到将点分配给正确簇的简单方法 我缺少什么 最终我想将对象作为多边
  • MAMP 和 PHP“SSL 操作失败,代码 1”

    EDIT我现在正在出差 iPhone 上的 Stack Exchange 应用程序上只有 SO 因此下面代码中的引号存在一些奇怪的格式 抱歉 我在真实代码中有真实的 两天来我一直在试图解决这个问题 还有一些其他问题 但是 只是想用file
  • Konva 拖拽无需移动拖拽元素

    我的问题是如何拖放形状 但克隆可拖动形状 并将该克隆拖动到可放置形状 我是 Konva 的新手 在查看文档和示例时 我可以找到如何拖放形状 我找到了形状克隆的参考 但我不知道如何做到这一点 如果有人能告诉我方法 我将不胜感激 谢谢 rect
  • 将模型追加到列表中

    我在创建模型列表时遇到问题 假设我已经创建了模型 gt rp lt rpart V41 data learnData method class 如果我直接创建列表 那就可以了 gt ll lt list rp rp rp gt class
  • -webkit-overflow-scrolling touch 不适用于固定元素

    我使用一个额外的样式表 其中包含以下内容来触摸设备 touch overflow x hidden overflow y scroll webkit overflow scrolling touch body overflow x hidd
  • 如何查找文件中特定行的字节位置

    从命令行查找文件中特定行的字节位置的最快方法是什么 e g linepos myfile txt 13 5283 我正在为一个大小为几 GB 的 CSV 编写一个解析器 如果解析器停止 我希望能够从上一个位置恢复 解析器是用 Python
  • 如何与张量流保存的模型预测器并行进行推理?

    张量流版本 1 14 我们当前的设置是使用张量流估计器进行实时 NER 即一次对一个文档进行推理 我们有 30 个不同的字段需要提取 每个字段运行一个模型 因此总共有 30 个模型 我们当前的设置使用 python 多重处理来并行进行推理
  • 如何构建一个累积的任一构建器

    我想为这两个表达式构建一个计算表达式 这很简单 type Result lt TSuccess gt Success of TSuccess Failure of List