问题标签 [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 回答
774 浏览

f# - 受歧视的工会可以相互引用吗?

我正在使用可区分的联合构建表达式树。下面的代码:

抛出错误,因为 BoolExpression 未定义。正如您所期望的那样,交换定义只会导致相反的结果(未定义 IntExpression)。

有没有解决的办法?

0 投票
2 回答
1975 浏览

inheritance - 受歧视的工会和继承

我正在为我的 F# 项目创建一个场景图,例如:

等等等等

每个项目都需要保存一组游戏对象来代表它的孩子。

例如,enemy1 的列表包含一只猫和一顶帽子,而猫列表包含跳蚤和一个毛皮球

所以我打算让它们都继承自一个类,该类包含一个描述该对象子对象的集合。

现在我的问题是:我 是否应该将子对象向下转换为 GameObject 并将它们存储在“GameObject”基类的列表中,或者创建一个有区别的联合,例如

并将对象存储为“SceneObjects”列表,以避免任何问题/开销与向上转换它们等。以及允许我描述对象未渲染和/或未用于碰撞检测的特殊情况,例如:声音发射器、陷阱触发器等。

区分联合+继承组合是我最初的想法;不过,由于我是 FP 的新手,我认为向专业人士寻求最好的、实用的方法来解决这个问题是明智的。

谢谢,

京东

0 投票
1 回答
1174 浏览

f# - 在 f# 中报废你的样板文件

我在 Haskell 编程语言中使用了Scrap Your Boilerplate和 Uniplate 库,我发现这种形式的泛型编程在可区分联合上非常有用。f# 编程语言中是否有等效的库?

0 投票
1 回答
1186 浏览

serialization - 在哪里可以找到 F# 可区分联合的序列化程序?

我需要将使用 F# 可区分联合表示的抽象语法树保留为人类可读的紧凑格式,例如 F# 语言中已用于构造可区分联合的格式,我可以稍后将其读回可区分联合实例。我有点惊讶 F# 库不支持这一点,因为它肯定必须在编译器和 F# 交互中以一种有效的方式完成。

是否有任何免费/开源实现以合理(但不一定非常)有效的方式执行此操作?

注意:我不想要基于 XML 的序列化。

0 投票
1 回答
317 浏览

f# - 如何将大型可区分联合树转换为可读形式?

以下类型显然非常大,因此手动编写代码将其转换为可读形式将是乏味的。我想知道以可读形式显示树的最简单方法。

这是如何显示的示例。(这与我前一段时间制作的有点不同。)

0 投票
2 回答
268 浏览

list - F# 区分联合从列表中选择 0 或 1

给定一个映射程序,我从一个字符串数组映射到一个可区分的联合,我想选择一个特定 DU 类型的实例。我知道会有 0 或 1 个实例。还有比这更聪明的方法吗?

谢谢

0 投票
2 回答
717 浏览

f# - 在有区别的联合上匹配

第一次使用 F# 进行生产,需要一点帮助。请参阅此代码,我在其中添加了我收到的警告作为每行的注释:

我检查了一下,这不是虚张声势,第三种情况和其他情况确实被忽略了。我没有得到什么?(我在实际实现中使用的 pd 和 sales 输入,我只是在这里省略了公式。)

我想要做的是使用有区别的联合,就像我在 C# 中使用枚举一样,然后打开它。所以在 C# 中我会输入这个:

有人可以帮我吗?

提前致谢,

格特-扬

0 投票
3 回答
2535 浏览

c# - C# 中类型安全的可区分联合,或者:如何限制接口的实现数量?

首先,很抱歉这篇冗长的帖子。基本上,我的问题是:

我正在尝试在 C# 中重现以下 F# 可区分联合类型:

谁能提出比以下更简单的基于接口的解决方案?


我所有的算法都识别这三种关系类型,而且只有这些,所以我需要防止IRelation第三方(即其他程序集)进一步实现。

脚注:对某些人来说,如果我的接口和算法在面向对象/多态性方面是正确的,那么将第三方实现注入到我的算法方法中并不重要,只要接口是正确实施。这是一个有效的批评。但是,让我们暂时假设在这种情况下我更喜欢函数式编程风格而不是严格的面向对象。

到目前为止,我最好的想法是将所有上述类型声明为internal(即外人永远不会直接看到它们)并创建一个代理类型Relation,这将是第三方唯一可见的类型:

到目前为止一切都很好,但它变得更加复杂......

  • ...如果我为具体关系类型公开工厂方法:

    /li>
  • …每当我公开一个处理关系类型的算法时,因为我必须从/映射到代理类型:

    /li>
0 投票
2 回答
2426 浏览

f# - 可区分联合中的类型之间的转换

我有一个函数,它可以返回不同的类型,为此我使用了有区别的联合。我需要的是从有区别的联合中的一种类型转换为另一种类型。还有一些类型可以转换为所有其他类型(String),但一些类型只能转换为 String (MyCustomType

为此,我将成员方法ConvertTo添加到ResultType

我不喜欢这样的构造,因为如果我添加更多类型,这需要我做很多更改:MyTypesResultType以及ConvertTo成员函数的几个地方。

任何人都可以为这种类型转换提出更好的解决方案吗?

提前致谢

0 投票
3 回答
710 浏览

haskell - 在 Haskell 中使用 FFI 联合和类型**?

我需要知道如何使用 FFI 解决 Unions 和 Type**(例如 int**)?我知道我需要一个可存储的结构实例,我也可以将它用于联合吗?

像这样的工会:

这通常在 Haskell 中表示为:

我的问题是你将如何将 myUnion 编组(定义一个可存储实例)到 my_union 中?我的理解是实例 my_union 会占用内存中的 sizeof(int) 个字节,即它的最大成员的大小。因此,为了存储它,我们将按照以下方式编写一些内容:

另外,您如何代表int**FFI?当我得到一个像int foo(int i1, int* i2); 签名这样的函数时:foo -> CInt -> Ptr CInt -> CInt

但如果有int foo(int i1, int** i2);