如何构建F#类型的实现业务规则?

2024-01-24

我正在尝试在 F# 中构建一个类型,当我获得该类型的对象时,我可以确定它处于有效状态。
该类型称为JobId它只持有一个Guid.
业务规则是:它必须是一个 Guid - 但不能是空的 Guid。
我已经在 C# 中实现了该类型,但现在我想将其移植到 F# 类库。

这是 C# 类型:

public sealed class JobId
{
    public string Value { get; }

    private JobId(string value)
        => Value = value;

    public static JobId Create()
        => new JobId(Guid.NewGuid().ToString("N"));

    public static Option<JobId> Create(Guid id)
        => id == Guid.Empty
        ? None
        : Some(new JobId(id.ToString("N"));

    public static Option<JobId> Create(string id)
    {
        try
        {
            var guid = new Guid(id);
            return Create(guid);
        }
        catch (FormatException)
        {
            return None;
        }
    }
}

那么如何在 F# 中构建它呢?谢谢!

更新1:
我尝试将其实现为受歧视的联合类型,如下所示:

type JobId =
    | JobId of string

但问题是,我无法用这种方法定义任何业务规则。
所以最后的问题是:如何确保string in JobId存在于一个 特定格式?


我已经调整了 Tomas 的答案,使用 DU 而不是类来保持适当的平等和比较,从而允许JobId例如,作为分组键按预期工作。

[<AutoOpen>]
module JobId =
    open System
    type JobId = private JobId of string with
        static member Create() = JobId(Guid.NewGuid().ToString("N"))

        static member Create(id:Guid) =
            if id = Guid.Empty then None
            else Some(JobId(id.ToString("N")))

        static member Create(id:string) =
            try JobId.Create(Guid(id))
            with :? FormatException -> None

您必须将类型放入模块内,然后您无法直接在该模块外部访问 DU 构造函数:

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

如何构建F#类型的实现业务规则? 的相关文章

  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • 不要模拟值对象:过于通用的规则,没有解释

    以下是 Mockito 单元测试框架的引用 不要模拟值对象 为什么有人会想要这样做呢 因为实例化对象太痛苦了 gt 无效 原因 如果创造新的装置太困难 那就是一个迹象 代码可能需要一些认真的重构 另一种方法是创建 价值对象的构建者 有一些工
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • C# 中附加/分离事件处理程序的不同方式有什么区别

    我的问题有两个部分 首先 我们可以通过以下两种方式附加事件处理程序 myObject MyEvent new EventHandler MyHandler myObject MyEvent MyHandler 据我了解 这两者是等价的 在第
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • 生成 .tail IL 指令的简单 F# 代码是什么?

    我想看看 tailIL 指令 但我一直在编写的使用尾部调用的简单递归函数显然已优化为循环 我实际上是在猜测这一点 因为我不完全确定反射器中的循环是什么样的 我绝对没有看到任何 tail不过操作码 我在项目的属性中检查了 生成尾部调用 我还尝
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 在“using”语句中使用各种类型 (C#)

    自从C usingstatements只是try finally dispose 的语法糖 为什么它接受多个对象仅当它们属于同一类型时 我不明白 因为它们需要的只是 IDisposable 如果它们都实现 IDisposable 应该没问题
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • asp.net c# 防止在从服务器端代码更改索引时触发 selectedindexchanged 事件

    我在同一个 aspx 页面上有两个下拉列表控件
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源

随机推荐

  • 将 pyQt UI 转换为 python

    有没有一种方法可以将使用 qtDesigner 形成的 ui 转换为 python 版本来使用 而无需额外的文件 我在这个 UI 中使用 Maya 并且将此 UI 文件转换为可读的 Python 版本来实现 这真的很棒 您可以使用pyuic
  • 获取每组最新的n条记录

    假设我有下表 id coulmn id value date 1 10 a 2016 04 01 1 11 b 2015 10 02 1 12 a 2016 07 03 1 13 a 2015 11 11 2 11 c 2016 01 10
  • java.lang.RuntimeException:无法实例化服务

    我正在尝试编写一个监视短信的应用程序 我想从我的主 Activity 类启动一个服务 但该服务由于某种原因没有启动 我认为我在清单文件中声明服务的方式或从活动中调用它的方式可能存在问题 这是我的活动代码的一部分 public class T
  • 如何从 Log4j Logger / Appender 中排除单个类?

    我有一个包 com example 这个包有五个类 我想将其中四个类记录到一个文件中 但排除第五个类 我可以写四个记录器 例如logger name com example Class1 并将相同的附加程序添加到所有四个记录器 有没有更简单
  • 如何对非托管 C++ Dll 进行强命名?

    我正在开发一个 C 应用程序 它使用EasyHook 库 http easyhook codeplex com 用于 DLL 注入 EasyHook 要求任何使用它的应用程序都必须是强命名的 为了对应用程序进行强命名 我需要确保我使用的所有
  • 立即调用函数表达式 (IIFE) 相对于普通函数的优势

    我对 javascript 很陌生 我读过模块模式 https addyosmani com resources essentialjsdesignpatterns book modulepatternjavascript提供某种名称空间并
  • keras 模型子类化示例

    从 Keras 2 2 0 开始 发布了模型定义的第 3 个 API 模型子类化 根据常见问题解答 然而 在子类模型中 模型的拓扑定义为 Python 代码 而不是静态的层图 这意味着 无法检查或序列化模型的拓扑 结果 以下方法和属性不可用
  • 如何在运行时更改外部类日志记录级别后刷新 log4j

    我有一些想要禁用的警告 他们来自 org eclipse lyo oslc4j provider jena JenaModelHelper 班级 所以我使用 log4j 并在运行时调用 Logger getLogger org eclips
  • 使用 Ajax 平铺滚动/预加载 HTML 层(Google 地图样式)

    我希望复制 Google Maps API 的平移 不一定是缩放 效果 但不包含图像 本质上 我想将 HTML 元素放置在一个大坐标系中 并能够在它们周围导航 Prezi http prezi com 样式 尽管没有旋转 最好 我想通过 j
  • Magento:您可以设置它以便所有网站共享相同的订单增量 ID 序列吗?

    有谁知道是否可以让所有网站或商店共享相同的订单增量 ID 基本上 我们正在使用一个 ERP 系统 该系统允许我们提交发票号码作为系统中的实际订单号码 但问题是 他们只需要一个号码序列 而不是像 Magento 那样为每个商店使用不同的号码序
  • 防止 asp.net mvc 应用程序中的多个 POST

    如果用户不断单击提交按钮 如何防止用户多次将相同的数据发布到操作 我知道在 php 中 有一种方法可以防止这种多次提交 但我没有看到任何用于 asp net mvc 的方法 有没有 您可以使用 JavaScript 禁用提交按钮 jQuer
  • 画布上绘制的圆圈与屏幕不匹配

    我想在屏幕中心画一个圆圈 但我得到的是这样的东西 我正在使用这段代码来绘制这个圆圈 public void onCreate Bundle savedInstanceState super onCreate savedInstanceSta
  • 减少 Pyinstaller 生成的可执行文件的文件大小的一般技巧有哪些

    我正在使用 Pyinstaller 将 python 脚本转换为可执行文件 该脚本包含来自各种包 如 nltk begin json 等 的多个导入 10 行代码生成的可执行文件为 54MB 这是不切实际的高 我知道它将所有模块打包在一个文
  • 形成对对象的引用是否构成访问?

    形成对对象的引用是否构成访问 以下是 GCC 和 Clang 目前所做的事情 void test int const volatile ptr noexcept ptr movl rdi eax Reads ptr maybe unused
  • 在使用 MediaCodec 进行编码之前裁剪视频以进行 Grafika 的“连续捕获”活动

    我正在了解 Grafika 的 连续捕获 活动 它是关于使用 MediaCodec 录制视频 活动源代码位于https github com google grafika blob master src com android grafik
  • 朱莉娅:外积函数

    In R 功能outer结构上允许您获取两个向量的外积x and y同时提供了许多应用于每个组合的实际功能的选项 例如outer x y 创建一个 外积 矩阵 其中包含元素之间的差异x and y 朱莉娅有类似的东西吗 广播是添加时发生的
  • 创意中的无定形镜片

    我尝试对 scala 2 10 3 使用版本 2 0 0 的无形状镜片 我有与此类似的代码 import shapeless case class A map Map String String case class B a A val m
  • 在 Android Jetpack Compose 中使用 State 时出现 java.lang.IllegalStateException

    I have ViewModel使用 Kotlin 密封类为 UI 提供不同的状态 另外 我用androidx compose runtime State通知 UI 有关状态更改的对象 如果出现错误MyApi请求发生时 我把UIState
  • iCloud 和 Xcode 6 - 无处不在的容器

    我目前正在开发一个适用于 iOS 8 的应用程序 它使用 iCloud Drive 和 CloudKit Framework 一切都是使用 Xcode 6 设置的 When I try to submit my App to iTunesC
  • 如何构建F#类型的实现业务规则?

    我正在尝试在 F 中构建一个类型 当我获得该类型的对象时 我可以确定它处于有效状态 该类型称为JobId它只持有一个Guid 业务规则是 它必须是一个 Guid 但不能是空的 Guid 我已经在 C 中实现了该类型 但现在我想将其移植到 F