问题标签 [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 投票
2 回答
286 浏览

types - “拆箱”通用类型的可区分联合/寻找好的解决方法

对于一个小的 AST 解析器,我有一个小的有区别的联合

用于其他一些结构,如

当我有这样的方法时

我知道 F# 推断int类型并在第二行中使用模式产生错误Real,所以我想知道,哪种代码设计是能够处理此类“通用”类型并返回其适当值的最佳设计给定的类型。

编辑

我在这里有一个非此即彼的情况,导致类似的功能

但是我想要一种封装这两种情况并“自动选择正确的情况”的方法。

这整个努力应该导致能够真正使用“盒装”值(如原始数据类型)运行计算,Int 42Real 13.能够返回适当的包装器。如果我想添加Real 1.并且Real 1.5我想提取1.0 + 1.5 = 2.5然后继续Real 2.5,但是我不想将所有内容都作为浮点数处理,以便区分整数和浮点数。

0 投票
3 回答
702 浏览

f# - F#:将有区别的联合和类层次结构结合在一起?

假设我有一个重要的类层次结构:

我想列出一个穿插这些和字符串的列表。

我以为我可以区分它

但唉,没有它就行不通

显然 Node 中描述的 Tag 和 String 是正交的,并且与现有的 Tag/String 类分开。将鼠标悬停给我类型Node.TagNode.String,这不是我想要的。

我现在拥有的是一个函数t,它创建一个StringTag继承自的函数Tag,给我

这非常好,但额外t增加了视觉噪音。我真正想要的是一个强类型的“两种不同类型的列表”,我可以使用 usingmatch语句。我认为这是区分联合的重点,但是它们无法使用现有的类型层次结构是一个问题,因为现有的层次结构(在这种情况下Tag)足够复杂,我认为对该类型子集的完整 OO 继承方法比纯歧视联盟方法

obj一种选择是在 之前/期间将其列为列表并投射所有内容match,但这并不是很好。还有其他方法吗?

0 投票
2 回答
2442 浏览

haskell - Haskell 中的代数数据类型是否等于 F# 中的可区分联合?

我正在学习 Haskell,想知道 Haskell 中称为代数数据类型的构造是否与 F# 中的可区分联合相同,或者它们之间存在一些细微的差异。

我还希望能将 F#(我的第一个函数式语言)与其他函数式语言进行很好的比较,尤其是在概念相似但存在实质性但重要差异的方面。

0 投票
3 回答
2362 浏览

f# - 枚举与非成员歧视工会

我刚刚注意到声明非成员歧视工会只有一点点区别:

并声明一个枚举:

它们在性能、使用等方面的主要区别是什么?你有什么建议什么时候用什么?

0 投票
3 回答
1859 浏览

f# - F#:嵌套的可区分联合和匹配

我有 2 个嵌套的歧视联合:

还有一个嵌套的匹配语句:

目标是构建一个请求字符串,调用看起来像这样req.Send(Update Producers)

无论如何,出于我不明白的原因,编译器给了我 2 个警告:

  1. Update(stype)我得到一条这条规则永远不会被匹配
  2. 第一次match stype在这个表达式上得到一个不完整的模式匹配。例如,值“生产者”可能表示模式未涵盖的情况。

所以问题是为什么我会收到这两个警告?我在匹配的过程中错过了什么吗?

0 投票
2 回答
1467 浏览

f# - fsharp 中受歧视的联合列表

谁能解释为什么下面的 2 个 let 语句不起作用?

此表达式应为 Card 类型,但此处的类型为 'a list

这让

表达式应该有类型 Card 但这里有类型 'a * 'b

0 投票
2 回答
190 浏览

hash - 为有区别的联合类型实现快速的 CustomEquality 和 CustomComparison

为了使用键引用一些坐标,我想使用可区分的联合类型,因为它们允许各种有效的模式匹配。

考虑以下代码片段:

我需要强制执行特定的排序顺序。例如 Spot < Vol 总是。我使用 sortKey 成员函数强制执行此操作。

AssetKey 又是一个非常相似的可区分联合类型:

所以这一切都很好,但它很慢。据我所见,如果调用 sortKey 函数,则会再次构建整个键,特别是再次调用 toString 函数。

一个明显的改进是添加一个缓存层,这更像是一种破解而不是一种解决方案。

进一步的优化是在字符串上使用哈希键。但是在这里我需要再次添加缓存,因为我需要缓存哈希键并且我不想重新计算它。

如果我使用结构或类,性能优化会更容易,但是我会失去模式匹配的灵活性,例如

什么是另一种表现良好的替代方法?在我的某些时间里,sortKey 函数损失了 30% 甚至更多的整体性能。

感谢您的任何建议和改进。

0 投票
3 回答
182 浏览

f# - 复制联合案例但在 F# 中具有不同的值

在 F# 中,我想基于现有实例构造一个可区分联合的实例(正确的术语?)。例子:

我可以插入什么代码来代替注释来创建这种效果?

0 投票
2 回答
1607 浏览

f# - 单一案件歧视工会的目的

我正在定义一个单子可观察/反应式解析器。这与普通解析器的行为完全不同,因为它是一个连续查询。底层类型是:

通过查看函数式语言中的各种解析器实现,似乎更合适的定义事物的方法是单例区分联合:

这意味着我需要提取底层函数来使用它:

问题是:这只是按照惯例,还是出于以后扩展的目的,或者即使定义从未改变,也有理由这样做?

额外的问题:如果只是为了更方便的类型签名,为什么不使用类型别名:

我已经在这方面取得了很大进展,并且没有发现不使用 DU 会影响可组合性的情况。

0 投票
3 回答
849 浏览

f# - 向 F# 可区分联合添加常量字段

是否可以将常量字段值添加到 F# 区分联合?

我可以做这样的事情吗?

如果我正在编写 Java 枚举,我会向构造函数添加一个私有值,如下所示: