如何在 F# 中创建作为值类型的 Union 类型?

2024-01-24

普通 F# 可区分联合是引用类型。我怎样才能创建一个simple(非递归且仅包含值类型字段)F# 中的联合类型是值类型吗?

根据一些互联网搜索,我当前(无效)的尝试如下所示:

[<StructLayout(LayoutKind.Explicit)>]
type Float =
    [<DefaultValue>] [<FieldOffset 0>] val mutable Val1 : float
    [<DefaultValue>] [<FieldOffset 0>] val mutable Int1 : int
    new (a:float) = {Val1 = a}    

以下博客文章似乎展示了通过 C# 可以实现的功能 http://jasonbock.net/Article/UnionsInDotNet

我知道上面的内容不是 F# 的惯用用法,但我正在尝试优化部分应用程序的性能,并且分析清楚地表明堆分配 (JIT_new) 的成本是导致我的性能瓶颈的原因。 . 简单的联合类型是满足我的需要的完美数据结构,只是不是堆分配的类型。


首先,我可能不会这样做,除非我有very很好的理由。在大多数情况下,结构体和引用类型之间的差异并不是那么大 - 根据我的经验,只有当您拥有一个非常大的数组时(然后结构体让您分配一个大的内存块),它才重要。

也就是说,F# 似乎不喜欢您示例中的构造函数代码。我真的不确定为什么(它似乎正在做一些对于重叠结构不太有效的检查),但以下方法可以解决问题:

[<Struct; StructLayout(LayoutKind.Explicit)>]
type MyStruct =
    [<DefaultValue; FieldOffset 0>] 
    val mutable Val1 : float
    [<DefaultValue; FieldOffset 0>] 
    val mutable Int1 : int
    static member Int(a:int) = MyStruct(Int1=a)
    static member Float(f:float) = MyStruct(Val1=f)

如果我真的想使用这个,我会添加另一个字段Tag含有1 or 0取决于您的结构代表的情况。然后,您可以使用活动模式对其进行模式匹配,并恢复受歧视联合的一些安全性:

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

如何在 F# 中创建作为值类型的 Union 类型? 的相关文章

随机推荐

  • 您可以将 HTML 图像标签的 src 属性设置为控制器方法吗?

    我知道你可以做到这一点 img src http some svg on the web 但是如果我有一个带有注释的控制器方法怎么办 ResponseBody RequestMapping value getSVG public Respo
  • pygtk导入gtk错误

    我下载了中描述的所有内容 pygtk http www pygtk org 用于安装 一切都很顺利 直到我尝试打字 import gtk 它抛出了一个ImportError如下 from gtk import gtk ImportError
  • 如果进程被终止,写入 write() 的数据是否会刷新到磁盘?

    我正在使用一个程序qdbm http sourceforge net projects qdbm 维护键值存储 qdbm 链接到程序中 在某些情况下 该进程会在 qdbm 数据库中放入一个值 然后通过调用外部 init 脚本 通过 syst
  • Phonegap垂直滚动

    我正在为 ios 构建一个phonegap 应用程序 并且遇到垂直滚动问题 即使没有任何内容 网络视图中似乎也会有一些像素滚动 这会影响我在 html 中内置的绝对定位的导航栏和选项卡栏 这是我的 html 页面 没有内容 但我仍然得到图像
  • Promise 重试,直到使用 Typescript 成功/失败

    我的移动应用程序会连续将多个文件上传到服务器 这些文件通常来自连接强度有问题的偏远地区 为此 我想尝试几次发送文件 我还想在失败时继续尝试下一个 导出结束时显示所有错误消息 即 已上传 10 个文件 3 个失败 但是 我无法弄清楚带有承诺的
  • 两行Xerces程序中的异常

    下面的代码给了我一个例外XMLFormatTarget行 但如果我更改字符串 C test xml to test xml 效果很好 test cpp Defines the entry point for the console appl
  • 将引号之间的逗号替换为空格

    您好 我的表中每一行都有如下数据 0150566115 HEALTH 401K IC ON ICON HEALTH 401K 1 08 21 2014 我想要的是删除双引号 之间的每个逗号 然后用逗号 分割字符串的其余部分 我不想检查双引号
  • std::sort 与本地类型比较

    下面的例子 file mysort cc include
  • Python 抓取 JSON 并将其转换为 CSV

    我对 python 很陌生 这可能是一个可怕的问题 但事情是这样的 我正在尝试从特定网站抓取数据并将该数据转换为 CSV 我已经设法获得一个可用的 scraper 并将文件保存在我的计算机上 然而 当我尝试再次将 JSON 加载到 pyth
  • swift:以编程方式创建 UILabel 固定宽度,根据文本长度垂直调整大小

    我见过涉及自动布局的垂直调整大小的答案 但是UILabel我正在创建的仅在运行时需要 我可能需要从零到多个这样的标签 示例 忽略颜色 短文本 注意与长文本宽度相同 较长的文本 注意与较短的文本示例宽度相同 并具有更多行用于添加文本 如果文本
  • Firebase - 当 Websocket 被公司代理/防火墙阻止时,是否有一个标志可以强制进行长轮询?

    我正在开发一个简单的企业 AngularJS 应用程序 并计划使用 Firebase 作为后端 我必须支持的浏览器是IE8和Chrome 最新 我已经成功修复了前端中所有与 IE 相关的问题 并且可以成功从我的 Firebase 检索数据
  • Eclipse:垂直排列函数参数

    我在 Windows 7 专业版上运行 Eclipse 3 7 2 如果我输入这样的方法声明 private void processCode String codename boolean doSomethingElse int num
  • 使用 Swift 将数据发布到服务器

    很快我几天来就一直面临这个问题 我不知道我在这里开始的错误是我的 viewcontroller swift import UIKit import Foundation var otp 0 class ViewController UIVi
  • JVM实现接口和纯抽象类的区别?

    我和我的朋友想知道 JVM 内部的接口和纯抽象类之间是否真的存在区别 或者它是否只是真正的语法糖 我真的不明白为什么会有差异 但它可能并不那么牵强 就字节码而言 classfile 而言 它们是完全不同的 From 4 1 类文件结构 ht
  • 需要示例 Java 代码来运行 shell 脚本 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我尝试了许多不同的例子 但它不起作用 我真的很感激一些运行 shell 脚本的示例 Java 代码 您需要 Runtime getRunt
  • 重命名 BitBucket 上配置的 git 项目的最简单方法

    我有一个托管在 BitBucket 上的项目 我可以重命名它吗 如果没有 并且我需要创建一个新的存储库 有人可以告诉我最简单的方法吗 并在 BitBucket 上创建新的存储库 令我困惑的一个具体原因是是在本地还是从 bitbucket 网
  • Oracle:设置查询超时

    我有一个 PL SQL 程序 它通过透明网关对 AS400 数据库进行查询 有时AS400不响应查询 可能是网络问题 并且PL SQL程序挂起 有没有什么方法可以为 Oracle 查询设置超时 以便在经过一定时间后出现异常 您是否尝试过设置
  • 如何创建 Java cron 作业 [重复]

    这个问题在这里已经有答案了 我正在编写一个独立的批处理 Java 应用程序来从 YouTube 读取数据 我想设置一个 cron 作业每小时执行某项工作 我搜索并找到了为基本操作执行 cron 作业的方法 但不适用于 Java 应用程序 您
  • 从自定义视图检索继承的属性

    我已经定义了一个父级styleable对于一些自定义视图如下
  • 如何在 F# 中创建作为值类型的 Union 类型?

    普通 F 可区分联合是引用类型 我怎样才能创建一个simple 非递归且仅包含值类型字段 F 中的联合类型是值类型吗 根据一些互联网搜索 我当前 无效 的尝试如下所示