通用 F# 函数:如何获取 F# 可辨别联合的类型?

2023-12-13

代码示例:http://www.tryfsharp.org/create/dutts/Generics.fsx

我的 F# 中有一些映射代码,它采用 C# 对象并将其包装在可区分联合中。

module MyModule =
    type MappedThings =
        | DoThings of External.Things.DoThings

    type MappedStuff =
        | DoStuff of External.Stuff.DoStuff

由于我总是在可区分联合中使用与外部对象相同的名称,因此我想尝试使我的映射代码通用以实现可扩展性。这是我到目前为止所尝试过的:

let toDomain<'T> external : 'T =
    let found = FSharpType.GetUnionCases(typeof<'T>) |> Seq.where (fun t -> t.Name = external.GetType().Name) |> Seq.head
    FSharpValue.MakeUnion(found, [| box external |]) :?> 'T  

我尝试像这样使用它:

let testThings = toDomain<MyModule.MappedThings> doExternalThings
let testStuff = toDomain<MyModule.MappedStuff> doExternalStuff 

这对于第一次调用效果很好,但如果我尝试将它用于 MyModule.MappedStuff 类型,它会抱怨

This expression was expected to have type DoThings but here has type DoStuff

我尝试过使用静态解析的类型参数 ^T,但 typeof 抱怨。

我想如果我能以某种方式传递“类型”(如果这是正确的术语,例如 MyModule.Mapped)作为参数,我就可以让它工作,但我不知道如何以编程方式获取它。

有人可以帮忙吗?


我认为您为第二个参数引入的附加拳击Makeunion使类型推断偏离轨道,事实上,该函数不再是通用的。注释参数或删除box.

let toDomain<'T> external : 'T =
    let found = FSharpType.GetUnionCases(typeof<'T>) |> Array.find (fun t -> t.Name = external.GetType().Name) 
    FSharpValue.MakeUnion(found, [| external |]) :?> 'T 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通用 F# 函数:如何获取 F# 可辨别联合的类型? 的相关文章

随机推荐

  • RSA加密-字节数组和字符串之间的转换[重复]

    这个问题在这里已经有答案了 我正在尝试实现 RSA 加密 它能够执行以下操作 接受字符串值作为使用公钥加密的输入 以字符串形式返回加密的密码 接受加密密码作为使用私钥解密的输入 返回解密后的原始值 如果我直接解密 我就能使加密 解密工作by
  • Java - 将 CSV 文件拆分为数组

    我已经成功地根据逗号分割了 CSV 文件 我通过在有 的地方放置一个虚拟字符串 然后根据虚拟字符串进行分割来做到这一点 但是 CSV 文件包含以下内容 something something something something some
  • JavaScript 计算器结果闪烁

    我的代码 已编辑 在所有变量前面添加了 var 谢谢 我尝试删除 但当我这样做时它不起作用
  • 通过C#调用MongoDB中的存储过程

    我在 system js 中有一个保存的函数 名为 addNumbers 它有 2 个参数 function addNumbers a b return a b 我希望通过 C 执行此函数 将用户输入的 2 个数字相加 到目前为止我有以下代
  • 如何向标签栏添加“更多”按钮?

    我的 iPhone 应用程序在视图底部有一个选项卡栏控制器 目前我在它上面有三个按钮 但是 我想添加更多内容 但要做到这一点 我需要将三个按钮中的最后一个按钮变成 更多 按钮 因为否则其他按钮上的文本会相互冲突 我知道如果标签栏中有超过 5
  • 如何使用 jsonOject 解析多行

    我正在从以下位置获取数据mysql using phpAPI 和我将结果传递给 androidJson encode但是当我将结果填充到 android listview 时 我只得到第一行 这是我在网上得到的结果 error false
  • 将 MMDDYYYY 转换为 PHP 的日期 [重复]

    这个问题在这里已经有答案了 我有一个带有日期的字符串 格式为 MMDDYYYY 即 01132012 01142012 等 如果该字符串距当前日期 14 天或更短 我需要在页面上执行某些操作 IE 今天是 01132012 因此任何日期为
  • C# 中浮点数转十六进制

    谷歌搜索我发现没有太多关于如何将数字转换为十六进制浮点单精度的信息 共有三个明确的步骤 1 转换整个二进制部分 2 添加逗号并将小数部分转换为二进制 3 将结果写入科学报告 4 将结果传递给 IEEE 754 标准 32 位 这将导致二进制
  • 非常简单的Java动态转换

    简单的问题 但我花了一个多小时来解决这个问题 我的代码如下 我需要使 SomeClass sc 动态化 因此 您将类名作为字符串传递到函数中 并使用该类代替 static someClass 该怎么办呢 SomeClass sc if so
  • 在 Play2 scala 模板中声明变量

    如何声明并初始化要在 Play2 Scala 模板中本地使用的变量 我有这个 var title String Home 在模板顶部声明 但它给了我这个错误 illegal start of simple expression displa
  • 如何截取 WPF 控件的屏幕截图?

    我使用 Bing 地图 WPF 控件创建了一个 WPF 应用程序 我希望能够仅截取 Bing 地图控件的屏幕截图 我使用这段代码来制作屏幕截图 Store the size of the map control int Width int
  • 从 procedure 形式转换为 let 形式

    我在scheme中编写了这个程序形式的代码 我需要将其更改为let形式 这是程序表单代码 define PI 3 14159265 define areac lambda d PI d 2 d 2 define volumec lambda
  • 如何使用 FQL 获取未读消息?

    我正在尝试获取所有未读收件箱的正文和发件人 为了获取所有带有未读消息的对话线程 我使用了以下查询 SELECT thread id from unified thread WHERE folder inbox AND unread 1 为了
  • Sed regexp 寻找空格或行尾

    我正在尝试检测包含三个部分的模式 A space m 或 t 空格或行尾 我想保留 2 和 3 例如 我想改变 我确信他没有 to 我确信他不会 我很难表达 3 因为 似乎只匹配空格 而不匹配行尾 这是我尝试过的 echo i m sure
  • 在 WebSphere 8.5 上使用 JASPIC 身份验证模块

    我有一个 JASPIC 身份验证模块 它在 GlassFish WildFly 和 WebLogic 上运行得非常好 现在我们有一个使用 WebSphere 8 5 的新客户 我无法让 auth 模块在那里正常运行 问题是 WebSpher
  • 与 PrimeFaces Converter 混淆(因为它适用于 selectOneMenu)

    AutoComplete demo 中 PlayersConverter 的实现实际上不仅充当转换器 还充当玩家列表的加载器 我对这个模型有点厌倦 因为加载已经在我的项目中实现了 我不明白为什么 Converter 接口没有作为模板实现 C
  • R 中的错​​误...缺少需要 TRUE/FALSE 的值[重复]

    这个问题在这里已经有答案了 以下是我的 R 脚本的一部分 for i in 1 N 1 if 50
  • Magento 管理网格将数据从 Action 发送到 Controller

    我正在尝试编写一个自定义操作来运行我构建的管理网格 是否可以通过 get 或 post 将网格中的列中的值发送到控制器 我尝试过谷歌搜索 但在任何地方都找不到正确的解释 如果可用的话 指向列设置 getter type 等 说明的链接也会很
  • 我应该何时为导出到 BigQuery 的 Firebase Analytics 数据运行每日 ETL 作业?

    我们使用 Firebase Analytics 从我们的应用收集事件 我们已启用将事件导出到 BigQuery 我们每天都会运行一些 ETL 作业 以便在 BigQuery 中创建更友好的分析表 例如会话 购买 问题是我们什么时候应该运行这
  • 通用 F# 函数:如何获取 F# 可辨别联合的类型?

    代码示例 http www tryfsharp org create dutts Generics fsx 我的 F 中有一些映射代码 它采用 C 对象并将其包装在可区分联合中 module MyModule type MappedThin