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

algorithm - 动态集运算 UNION 将两个不相交的集合 S1 和 S2 作为输入

这是我试图解决的家庭作业问题,只需要有人看看并告诉我我做对了还是磨损了..

动态集合运算 UNION 以两个不相交的集合 S1 和 S2 作为输入,它返回一个由 S1 和 S2 的所有元素组成的集合 S = S1 U S2。集合 S1 和 S2 通常被操作破坏。展示如何使用合适的列表数据结构在 O(1) 时间内支持 UNION

我正在考虑有两个可以在恒定时间内完成的链接列表,但为此我们需要记住指向列表的第一个(头)和最后一个(尾)元素的指针。结构节点{字符*字;结构节点*下一个;} 结构集{ 结构节点* 头;结构节点*尾;对于每个带有头指针的列表,我们还将保留一个尾指针。支持 O(1) 时间内的联合操作:假设我们有两个集合 S1 和 S2。

我的方法是否朝着正确的方向发展?

0 投票
1 回答
640 浏览

dynamic - 是否可以在 fsharp 中动态生成有区别的联合?

我正在研究System.ComponentModel.Composition在 Fsharp 中使用,并想知道是否可以在内存中动态生成一个有区别的联合?我想要 DU 是基于导入的类型的元素构建的。主要原因是我有一个 DU 的代码,我认为使用它最简单Composition。我完全准备好接受这是错误的做法。

过去我用过FSharpTypeFSharpValue做各种事情,但似乎这些都是关于操纵现有的 DU 而不是创建新的 DU。

很抱歉,我什至还没有“我试过这个”代码示例,因为我不知道从哪里开始。

  • 可能吗?
  • 可取吗?
  • 我真的应该使用 DU 来表示来自 Composition 的内容吗?
  • 我很高兴使用反射,即使它有点慢。

编辑

  • 是否可以/建议动态添加到 DU?(如果必须存在 DU)
0 投票
2 回答
92 浏览

types - 在变量绑定中使用有区别的联合类型

我制作了一个自定义类型,并希望创建 2 个变量来证明我的类型按预期工作。

我应该如何更改变量声明以强制它们键入number?目前a是int,b是float。

0 投票
3 回答
4488 浏览

c++ - 关于 C++ 非 POD 联合的问题

C++11 让我们可以在联合中使用非 POD 类型,比如我有以下代码;

在我班的某个地方,一次只有一个成员会活跃,现在我的问题很简单。

  1. uny的默认值是多少?- 不明确的?
  2. 每当我的班级被破坏时,哪些成员(工会内)(如果有的话)将被破坏?
    • 假设我必须 std::typeinfo 来跟踪哪个是活动成员,然后我应该在析构函数中显式调用该成员的析构函数吗?
  3. 有没有人有语言提案的链接,它改变了工会以接受非 POD 类型?
0 投票
2 回答
2042 浏览

f# - 可区分联合的 F# 限制

我正在尝试将一个小型编译器从 C# 移植到 F#,以利用模式匹配和可区分联合等功能。目前,我正在使用基于 System.Linq.Expressions 的模式对 AST 进行建模:一个抽象基“表达式”类、每个表达式类型的派生类和一个 NodeType 枚举,允许在不进行大量转换的情况下切换表达式。我曾希望使用 F# 有区别的联合来大大减少这种情况,但我遇到了几个看似限制:

  • 强制公共默认构造函数(我想对表达式构造进行类型检查和参数验证,就像 System.Linq.Expressions 对它的静态工厂方法所做的那样)
  • 缺少命名属性(似乎这在 F# 3.1 中已修复)
  • 无法直接引用案例类型。例如,似乎我不能声明一个仅从联合中获取一种类型的函数(例如let f (x : TYPE) = x编译为Expression(联合类型)而不是为Addor Expression.Add。这似乎牺牲了我的 C# 方法的一些类型安全性。

这些或设计模式是否有很好的解决方法可以让它们不那么令人沮丧?

0 投票
2 回答
176 浏览

regex - 对带括号的一维列表应用递归

我对 F# 有点陌生,我正在尝试编写一个简单的程序来读取数学表达式并计算它。

我成功地计算出诸如:等表达式"5+3 *3 - 1/2""10 + 50 /50"由于这相当简单并且通过直接递归完成,我想使用其他数学函数(cos、sin 等)将其提升到一个新的水平,但是。. . 我偶然发现了括号,因为我不知道如何递归诸如“((5 + 3)* 5)-(4-5)”之类的模式,因为这是所谓的令牌(我用正则表达式“标记”输入字符串") 和具有无限表达式的外层和内层的列表!

这是我用于第一个计算原型的代码:

注意标记:加号、减号、整数等。这是我试图用来计算更复杂表达式的相同方法。

更新:这是我在标记化后得到的列表:

更新:有没有一种方法可以将令牌列表的一部分“替换”为令牌列表类型的一个令牌?像这样:

变成:

任何想法都会有所帮助,谢谢!

0 投票
2 回答
125 浏览

types - 可以定义一个函数来判断一个元素是否是从给定的类型构造函数构造的吗?

我在 F# 中工作,并且有一个 T 类型,它是几件事的有区别的联合:

如果我有一个 T 列表,我可能想取出使用 A 构造的东西。像这样进行模式匹配很容易:

嵌入的匹配有点冗长,并且在保持下划线数量与 A 的定义同步方面存在一些小的维护麻烦。我真的很喜欢这样的函数:

有没有办法定义这个“constructedFrom”函数?

0 投票
3 回答
1076 浏览

f# - 如何在 f# 中解开列表中的联合值

您知道要解开单个联合类型的值,您必须这样做:

但我的问题是:如果有办法为列表做到这一点?:

谢谢。

0 投票
1 回答
104 浏览

generics - 将 Union<'a> 转换为 Union<'b>

假设我定义了一个 F# 可区分联合,如下所示:

例如,如果我有一个Bwhere 'Tis int,我将如何将它转换为另一个Bwhere 'Tis a string?我有一个与此类似的联合,但有更多情况,目前我的模式匹配如下:

0 投票
2 回答
138 浏览

f# - 模式匹配中的 F# 惯用强制转换?

假设以下代码:

“消息”是 System.Object 类型的地方,我可以做些什么来使模式匹配更好?例如一些通用的活动模式或一些这样的?

也许这个问题太短了,但我只是想看看是否有办法使上述语法更好