使用 Reflection.Emit 生成可区分的联合
Using Reflection.Emit to generate Discriminated Unions
我想知道是否可以使用 Reflection.emit
(或其他任何东西)在 f# 中生成 DU,或者甚至向已定义的 DU 添加新案例。
我一直在看msdn网站,我发现我能做的就是获取联合案例或创建联合案例。通过使用 FSharpValue.MakeUnion
或使用带有 Expr.NewUnionCase
的引号来创建它们。
我在使用这些方法时遇到的问题是我如何能够以这样的方式绑定它们,使我创建的联合案例属于同一个 DU?也许这不是解决这个问题的正确方法。在那种情况下,我将如何动态生成 DU?
P.S: 目标是在 Type 提供程序 内生成 DU。这意味着,如果我没记错的话,当编译成 .dll 文件时,我将能够访问脚本文件中由 TypeProvider 生成的 DU。因此这意味着我将能够在 DU 的实例上应用模式匹配,并且还获得 DU 提供的类型安全性(例如模式匹配中所有情况的详尽性)。
我会看一下 F# Compiler Services 以动态生成可区分的联合。基本上,您依靠 F# 编译器生成所需的类型。我有限的理解是,记录和可区分的联合都需要某种类型之外的程序集元数据,以便 F# 编译器识别它们。如果您走 Reflection.Emit 路线,则需要确保任何生成的程序集都具有此元数据(如果可能的话) API。
从 F# 4.0 开始,类型提供程序现在无法公开记录和可区分的联合。有a F# Uservoice suggestion for it;但它可能还需要一段时间才能成为语言。我要做的是用上面的编译器服务生成一个联合,并添加一个 "Match" 成员,其中包含模式匹配。当它通过类型提供程序机制时,它不会是正式的 "DU",但仍然可以工作。
我想知道是否可以使用 Reflection.emit
(或其他任何东西)在 f# 中生成 DU,或者甚至向已定义的 DU 添加新案例。
我一直在看msdn网站,我发现我能做的就是获取联合案例或创建联合案例。通过使用 FSharpValue.MakeUnion
或使用带有 Expr.NewUnionCase
的引号来创建它们。
我在使用这些方法时遇到的问题是我如何能够以这样的方式绑定它们,使我创建的联合案例属于同一个 DU?也许这不是解决这个问题的正确方法。在那种情况下,我将如何动态生成 DU?
P.S: 目标是在 Type 提供程序 内生成 DU。这意味着,如果我没记错的话,当编译成 .dll 文件时,我将能够访问脚本文件中由 TypeProvider 生成的 DU。因此这意味着我将能够在 DU 的实例上应用模式匹配,并且还获得 DU 提供的类型安全性(例如模式匹配中所有情况的详尽性)。
我会看一下 F# Compiler Services 以动态生成可区分的联合。基本上,您依靠 F# 编译器生成所需的类型。我有限的理解是,记录和可区分的联合都需要某种类型之外的程序集元数据,以便 F# 编译器识别它们。如果您走 Reflection.Emit 路线,则需要确保任何生成的程序集都具有此元数据(如果可能的话) API。
从 F# 4.0 开始,类型提供程序现在无法公开记录和可区分的联合。有a F# Uservoice suggestion for it;但它可能还需要一段时间才能成为语言。我要做的是用上面的编译器服务生成一个联合,并添加一个 "Match" 成员,其中包含模式匹配。当它通过类型提供程序机制时,它不会是正式的 "DU",但仍然可以工作。