问题标签 [discriminated-union]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
238 浏览

generics - 可以用 fsharp 中的泛型替换 GetUnionCases 吗?

我有以下功能。它用于将字符串的一部分转换为可区分的联合情况。我有特定的,并且一直在对代码进行重复数据删除和概括。

我想做类似以下的事情:

但这不起作用(所以我最终采用了反射方法)

提前谢谢

0 投票
1 回答
155 浏览

recursion - 创建递归可区分联合值

当我有这个代码时:

编译器给出以下错误:

递归值不能直接作为递归绑定中“HtmlNode”类型的构造出现。此功能已从 F# 语言中删除。考虑改用记录。

这是为什么?let rec 应该支持递归值的创建,并且类似的东西适用于记录。

0 投票
4 回答
553 浏览

.net - F#按案例标识符比较有区别的联合

有没有办法通过 F# 中的案例标识符来比较有区别的联合?

如何compareCases以通用方式实现功能?

即类似于以下内容,但更通用(反射是可以的):

0 投票
1 回答
106 浏览

f# - F# 编译器可以使用柯里化来根据类型分隔代码路径吗?

F#编译器可以通过currying一个函数来分离代码路径,其中不同类型意味着通过后续调用的函数的不同路径?

考虑以下有区别的联合。有两种可能性,理论上是不同的类型:

假设我们对其中一些情况有一些特定的功能:

以及 2 个函数,它们根据某些类型提供 2 个单独的代码路径param(完成 fs 文件的其余部分):

因此,Half 和 Double 是独立的代码路径,我们可以将它们编写为两个独立的函数。

从理论上讲,柯里化会说有两种不同的功能;如果您将第一个参数 curry 为 Choice.Halve 或 Choice.Double 类型(如 in doubler),那么您拥有特定于该类型的函数,编译器应该能够优化以后的分支。

是这样吗?

如果我查看 IL,我看不到这样的优化,但我想这可能是 JITted。一位同事建议分支预测使这种优化变得不必要。

是避免不必要的分支反转结构并传递divide/halve函数的唯一方法吗?

- 编辑 -

John Palmer 建议添加inline,所以我尝试了一下,得到了以下优化的 IL outer

然而,curried 函数并没有明显的优化- 所以 uncurrieddoubler函数main正在被优化,而不是 curried 函数。

0 投票
3 回答
442 浏览

f# - 你能封装多案例歧视联合吗?

我看到你可以强制使用单案例区分联合的构造函数,你可以对多案例做同样的事情吗?

例如

我目前正在尝试fsi这样

但我猜像 C#,F# 不允许你根据返回类型重载展开:

编辑 - - - - - - - -

MemberId.fsi =

MemberId.fs =

似乎很接近,但解包器无法编译,我似乎无法弄清楚如何编写它

TestConsumer MemberIdClient.fs =

0 投票
1 回答
554 浏览

f# - 您可以在没有签名文件的情况下解开有区别的工会吗?

使用给定的 Single-Type-Case DU 进行设计

我通过 Answers to wrapping Multi-case DU's.fsi看到你可以很容易地在没有文件的情况下进行构造函数阴影。

通过展开我的意思是从文章中(如果我们有一个文件let value (EmailAddress e):string = e,它必须在.fsi文件中或应用于这种DoB类型看起来像 。let value (DoB dob):DateTime = dob.fsi

你能以某种方式对构造函数进行的解包做同样的事情吗?

我可以以某种方式定义某种解包器或增强器吗?

0 投票
1 回答
142 浏览

types - 为什么在有区别的联合中使用选项类型是错误的?

我正在尝试使用可区分联合创建树节点数据类型。

但是,编译器给我一个错误提示“此声明中不允许使用匿名类型变量”</p>

是什么导致错误?

0 投票
2 回答
552 浏览

f# - 区分联合案例的自定义类属性

使用下面的代码,成功和失败被编译成 2 个独立的类。如何为成功和失败提供自定义属性?

编辑 因为SuccessFailure导致类我需要用类兼容属性来装饰它们AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Interface)

我可以让它工作吗?如果不是,为什么不呢?

0 投票
2 回答
157 浏览

f# - 在 F# 中,如何将元数据附加到可区分的联合值?

我想为值而不是 int 创建类似于枚举的 F# 记录类型。例如,如果我有工会:

我知道意大利面总是30厘米长,西红柿总是红色的。我能做的是有一个“获取元数据”功能:

但我真的很想把联合的定义和数据放在一起。有没有很好的方法来做到这一点?

0 投票
1 回答
126 浏览

f# - f#:常量联合案例标签号

可区分联合类型中的每个联合案例都有一个标签号

通过查看已编译的代码,它是由编译器和常量生成的,具体取决于案例的顺序。所以成功为0,失败为1。

  • 标签号总是根据订单生成吗?这是在 F# 规范中吗?
  • 是否可以提供自定义标签号,以便如果订单更改或我在中间放置另一个案例,在成功和失败之间,它们的标签号不会改变?

我正在尝试通过创建自定义类型模型并将成功和失败添加为结果的子类型来设置 protobuf-net 以序列化有区别的联合。但要使其工作,需要为每个类指定,它必须保持不变。我希望自动化设置,但需要能够有一个与每种类型相关的数字,并且这种关系永远不会改变。标记似乎是完美的,如果它可以在有区别的联合定义中进行硬编码。