在 F# 中的 Choice 之上构建 Either(或 Result)

2024-04-24

我根据 Scott Wlaschin 中的信息构建了一个成功/失败的 monadblog http://fsharpforfunandprofit.com/posts/computation-expressions-wrapper-types/得到额外的帮助堆栈溢出发布 https://stackoverflow.com/questions/21801144/wrangling-trywith-in-computation-expressions。我最终得到了一个类型

type Result<'a> = 
| Success of 'a
| Error of string

我现在意识到这相当于 F# 中的 Choice 和 haskell 中的 Either。我想重用代码而不是保留自己的代码,但只想更改实现而不必更改现有代码。我想在实施 Choice 的同时使用我现有的名称。 (或者可能是 fsharpx 中的扩展选项。)

我努力了

type Result<'a> = Choice<'a, string>
let Success = Choice1Of2
let Error = Choice2Of2

这几乎有效,但是当我在匹配中使用 Error 时,我收到错误“未定义模式鉴别器‘Error’。

    match getMetaPropertyValue doc name with
    | Error msg -> ()
    | Success value -> value

您还需要一个活动模式:

type Result<'a> = Choice<'a,string>
let  Success x :Result<'a> = Choice1Of2 x
let  Error   x :Result<'a> = Choice2Of2 x
let  (|Success|Error|) = function Choice1Of2 x -> Success x | Choice2Of2 x -> Error x

那么对于Either:

type Either<'a,'b> = Choice<'b,'a>
let  Right x :Either<'a,'b> = Choice1Of2 x
let  Left  x :Either<'a,'b> = Choice2Of2 x
let  (|Right|Left|) = function Choice1Of2 x -> Right x | Choice2Of2 x -> Left x

我就是这样做的here https://github.com/gmpl/FsControl/blob/master/FsControl.Core/Samples/Haskell.fsx#L30-33.

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

在 F# 中的 Choice 之上构建 Either(或 Result) 的相关文章

  • 从传递给 C# 的 F# 列表中检索项目

    我在 C 中有一个在 F 中调用的函数 将其参数传递到Microsoft FSharp Collections List 如何从 C 函数中的 F 列表中获取项目 EDIT 我找到了一种 函数式 风格的方式来循环它们 并且可以将它们传递给如
  • 从 Cats 理解并行类型类

    有一个类型类叫做Parallel in Cats 此类的目的是为一些不支持开箱即用并行计算的 monad 提供并行计算 例如Either例如 我知道Monad用于相关计算 因此需要顺序执行 Applicative用于独立计算 因此此类计算可
  • 针对 unsafePerformIO 的部门限制

    工作中有人讨论过将其作为一项全部门政策 禁止使用unsafePerformIO及其同类 就我个人而言 我并不介意 因为我一直认为 如果我发现自己想要使用它 通常意味着我需要重新考虑我的方法 这个限制听起来合理吗 我似乎记得在某处读到它主要是
  • 对 F# 联合类型列表进行操作

    这是我的问题的延续F 联合类型列表 https stackoverflow com questions 13770911 f list of union types 感谢有用的反馈 我能够创建一个列表Reports with Report要
  • 在 F# 中处理 Deedle 时间序列中的缺失值 (1)

    这是一个小例子 我想处理系列上自定义函数的缺失值 假设我已经获得了一系列 series4 val it Series
  • F#:将字符串选项转换为字符串的最短方法

    目标是转换一个string option这是通过一些很好的类型计算得出的一个简单的string然后可以传递到 UI printf URL 其他只想要一个字符串并且对选项类型一无所知的东西 None应该变成空字符串 显而易见的方法是做一个ma
  • 如何统计字符串中特定字符的出现次数

    我不知道从哪里开始检查字符串中特定字符的 n 次出现 我已经列出了我认为是该功能框架的基本轮廓 但我不确定内容是什么 let countCharFromNth getStr string chkdChar char if getStr Le
  • 类型 x 比值更难访问

    这是我的代码的抽象 module RootModule module private SubModule I want everything in this module to be inaccessible from outside th
  • F# 中的异步 EF 查询

    在使用 EF6 的 C 中 我可以轻松地进行如下异步操作 using var context new MyDbContext var item await context SomeEntities Where e gt e Id 1 Fir
  • F# 中使用抽象类还是接口?

    从 C 背景开始摸索 F 在 C 中 决定何时使用接口和何时使用抽象类有明显的区别 在 F 中 我发现两者几乎合而为一 我知道 就 CLR 而言 F 中的做法与 C 中的做法相同 但是在 F 中编程时使用的 最佳实践 是什么 我应该完全避免
  • 如何更改 Rx Builder 实现来修复堆栈溢出异常?

    我正在尝试提出一个 Rx Builder 以在 F 计算表达式语法中使用反应式扩展 我该如何修复它 以免堆栈崩溃 就像下面的 Seq 例子一样 是否有计划提供 RxBuilder 的实现作为响应式扩展的一部分或作为 NET Framewor
  • 在 Blazor 中显示计时器

    我正在尝试在服务器端 Blazor 应用程序中显示倒计时器 我的代码同时使用 F 和 C 语言 该代码在某种程度上可以工作 但计时器永远不会按预期停止 并且计时器显示偶尔不会呈现所有数字 这是我第一次尝试 Blazor 服务器端应用程序 我
  • Async.TryCancelled 不适用于 Async.RunSynchronously

    我尝试创建一个根据用户交互更新 UI 的代理 如果用户单击按钮 则应刷新 GUI 模型的准备需要很长时间 因此希望如果用户单击其他按钮 则取消准备并开始新的准备 到目前为止我所拥有的 open System Threading type p
  • 如何解决“程序主模块为空:运行时不会发生任何事情”

    我在 F 解决方案中有两个项目 1 主要项目有 EntryPoint http msdn microsoft com en us library dd402151 aspx并设置为启动项目 2 support 第二个项目 拥有一组支持模块
  • 如何在插件场景中实现程序集绑定重定向?

    我有一个plugin P延伸和application A NET40 我无法控制 P 程序集 NET40 有一个shared dependency D NET35 P和D都依赖于FSharp Core 但版本不同 P是针对FSharp Co
  • `ImmutableSortedSet` 和 fsharp `Set` 有什么区别?

    BCL引入了一组Immutable Collections http blogs msdn com b bclteam archive 2012 12 18 preview of immutable collections released
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 管道序列中的异常处理

    我正在开发一个基本的 2D CAD 引擎 管道操作符显着改进了我的代码 基本上 有几个函数从空间中的点 x y 开始 并在多次移动操作后计算最终位置 let finalPosition startingPosition gt moveByL
  • 使用 SqlBulkCopy 和 F# 在 SQL 中导出矩阵

    我想将大量数据从 F 传输到 SQL 表 基本上我的 F 代码创建了一个三列矩阵 UserID ProductID and price 和N行 我想将其 复制 粘贴 到数据库中 我尝试了多种选择 但最终 从 F 传输数据非常慢 10000
  • F# 正确使用序列缓存

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

随机推荐