在 F# 中“合并”受歧视的联合?

2024-05-04

继从这个问题 https://stackoverflow.com/questions/53506325/result-vs-raise-in-f-async,我在组合不同类型时遇到问题Result类型在一起。

(以下是一个人为的示例,不是真实的代码)

假设我有一个读取文件的函数:

type ReadFileError = 
| FileNotFound of string

let readFile (path : string) : Result<string, ReadFileError> =
  // --- 8< --- 

以及一个以某种方式解析它的函数:

type JsonParseError = 
| InvalidStructure of string

let parseJson (content : string) : Result<Json, JsonParseError> = 
  // --- 8< --- 

现在我可以将它们组合起来创建一个读取和解析文件的函数:

type ReadJsonError = 
| ReadFileError of ReadFileError
| JsonParseError of JsonParseError

let readJson (path : string) : Result<Json, ReadJsonError> = 
  match path |> readFile with
  | Ok content -> 
    match content |> parseJson with 
    | Ok json -> Ok json
    | Error e -> Error (ReadJsonError.JsonParseError e)
  | Error e -> Error (ReadJsonError.ReadFileError e)

正如您所看到的,统一错误类型相当尴尬。我需要定义一个新的联合类型并包装Error正确地一侧。对于基于异常的方法,您不必担心这一点,因为 throw 就类型而言是开放式的。

是否有可能使Result组合不同类型错误时的样式是否方便?


组合错误类型是一个问题Result我只是在尝试时才意识到这一点。

除了异常之外,这可以通过让所有异常继承基类来“解决”。所以一种类似的方法可能是type R<'T> = Result<'T, exn>

但是,我发现这没有吸引力,并且通常会陷入一种模式,即我定义自己的结果类型,该类型允许同质类型的聚合失败。

有点像这样

type BadResult = Message of string | Exception of exn
type BadTree = Leaf of BadResult | Fork of BadTree*BadTree
type R<'T> = Good of 'T | Bad of BadTree

另一种方法可能是结合Result失败使用Choice。不确定一个人最终会因为这个而进入一个特别有吸引力的地方。

let bind (t : Result<'T, 'TE>) (uf  'T -> Result<'U, 'UE>) : Result<'U, Choice<'TE, 'TU>> = ...

这可能根本对您没有帮助,但也许它会产生一些关于如何继续的想法?

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

在 F# 中“合并”受歧视的联合? 的相关文章

随机推荐

  • 来自库的 CMake link_directories

    我正在尝试使用 CMake 和 Xcode 从另一个库链接到一个库 这对任何图书馆来说都是一个问题 但为了让事情更容易传达 让我们使用zlib举个例子 这似乎适用于可执行文件 如下所示 LINK DIRECTORIES LIB DIR zl
  • 在 IntelliJ IDEA 中使用 JTable

    我在intellij中以gui形式创建了一个jtable 但我没有看到任何数据 最奇怪的是 当我使用它时没有在 intellij 中创建表单 该代码有效 我用了最常见的例子 String columnNames First Name Las
  • Python - randrange() 的空范围 (0,0, 0) 和 ValueError("randrange() 的空范围 (%d,%d, %d)" % (istart, istop, width))

    当我运行这个程序时 python 3 3 1 import random import time from random import randrange print print I am thinking of a person time
  • jQuery Mobile:Listview 筛选搜索回调函数

    嘿 我想要一个过滤器搜索 这样您输入搜索的两个字母 相应的结果就会显示在列表视图中 我无法像 jqm listview 那样加载整个列表 因为它太大了 有人可以告诉我如何做到这一点 这有点超出了我理解 API 的范围 我知道如何使用 jqu
  • 如果我在不打算升级到 websocket 连接的 HTTP 请求中包含“Upgrade”和“Connection”标头,会发生什么情况?

    我有一个 Nginx 服务器块 用于代理对 node js 服务器的请求 该服务器同时提供 HTTP 内容和 WS websocket 内容 是否可以在不应升级到 Websocket 连接的请求上添加升级标头 即使用 Nginx 代理到服务
  • RedirectToAction 导致 ASP.NET MVC 3 中“路由表中没有与提供的值匹配的路由”

    我有一个项目最近升级到 ASP NET MVC 3 在我的本地计算机上 一切正常 当我部署到服务器时 每当我使用RedirectToAction称呼 它抛出一个System InvalidOperationException与错误消息路由表
  • 我可以在 C++ 结构上实现 .ToString() 以进行调试吗?

    在 C 中 如果我定义了一个结构体 我还可以重写 ToString 然后 当我进行调试并添加监视或将鼠标悬停在结构的实例上时 工具提示将是计算出的 ToString 而不是结构的类型名称 我可以在 C 和 或 C CLI 中以某种方式做到这
  • 为什么我不能将一个类划分为多个文件

    我正在尝试创建一个类TestClass它分为几个文件 我将它分成 3 个文件 其中第一个文件TestClassPart1 php已经开始上课了class TestClass 和最后一个文件TestClassPart3 php有班级的右括号
  • python统计前10名

    使用Python 2 6 我有很大的文本文件 以下是前 3 个条目 但我需要检查超过 50 个用户 html log jeff 1153 3 1 84 625 54 1 2 71 3 2 10 7 58 499 3 5 616 36 241
  • ruby 运算符 ||= 智能吗?

    我有一个关于 ruby 中 语句的问题 这对我特别感兴趣 因为我正在使用它写入内存缓存 我想知道的是 首先检查接收器 看看它在调用该设置器之前是否已设置 或者它实际上是一个别名x x y 对于普通变量来说这并不重要 但使用类似以下内容 CA
  • firestore 读取是异步的,我想要同步行为

    我想在本地存储从云端读取的数据 为了实现这一点 我使用一个全局变量 quizzes 来保存所有数据 为此 当我构建我的Quiz对象 我需要确保在创建它们之前 相关数据已经从云端下载 因为从 firestore 读取数据时 它是异步发生的 我
  • 在 Python 中向字典中添加新项目[重复]

    这个问题在这里已经有答案了 如何在 Python 中向现有字典添加项目 例如 给定 default data item1 1 item2 2 我想添加一个新项目 default data default data item3 3 defau
  • SQLite3内存数据库到磁盘的纯Python备份

    在不安装额外模块的情况下 我如何使用SQLite备份API https sqlite org c3ref backup finish html将内存数据库备份到磁盘数据库 我已成功执行磁盘到磁盘备份 但将已存在的内存中连接传递给sqlite
  • 在动态 Web 项目中处理配置(数据库登录名和密码等)的正确方法是什么?

    我刚刚开始使用 JSP 进行动态 Web 编程 处理配置的正确方法是什么 例如 数据库名称 主机 登录名和密码以及服务器中的索引目录等 我最关心的是密码的安全性 目前我将数据硬编码到 java 文件中 我认为这不是正确的方法 所以我想从您的
  • 如何在MySQL中使用数字字符串的比较运算符?

    我有一个员工表 有类似领域的经验VARCHAR类型 此字段结合了用短划线 分隔的总年份和总月份 因此我必须按年份过滤具有 3 年以上经验的经验 我的表结构 所以现在我必须获得3年以上经验的id 我尝试如下 SELECT FROM emplo
  • 使用 Python 的 email.generator 包创建电子邮件草稿

    我目前正在使用此代码通过 Python 生成电子邮件 from email import generator from email mime multipart import MIMEMultipart from email mime te
  • 相机图像旋转问题

    我在这里面临一个非常奇怪的问题 当我在纵向模式下单击图像并上传它 然后再次获取它时 它会逆时针旋转 90 度显示 但是当我在相机胶卷中看到它时 它会以正确的方向显示 因为它被拍摄 我已经尝试了几乎所有可能的链接 代码来解决这个问题 但似乎没
  • 显示删除了多少行

    我使用C 程序 我的数据库是SQL Server 2008 当用户从数据库中删除一些行时 我想在 Windows 应用程序中向他 她显示删除了多少行 我想知道如何将 SQL 消息发送到 C 并向用户显示 例如 当我从表中删除 4 行时 SQ
  • 删除框架,同时保留 pyplot 子图中的轴

    我正在创建一个包含 3 个子图的图形 并且想知道是否有任何方法可以移除它们周围的框架 同时保持轴就位 如果您想删除轴脊 但不想删除其他信息 刻度 标签等 您可以这样做 fig ax plt subplots 7 1 sharex True
  • 在 F# 中“合并”受歧视的联合?

    继从这个问题 https stackoverflow com questions 53506325 result vs raise in f async 我在组合不同类型时遇到问题Result类型在一起 以下是一个人为的示例 不是真实的代码