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

f# - 通过模式匹配比较 F# 可区分联合实例

首先,为糟糕的标题道歉——我对 F# 的理解不足以更好地描述这个问题。

考虑这个简单的 DU:

我用不同的货币表示货币,并重载 (+) 运算符,以便我可以安全地执行 Money + Money。但是,如果我有很多货币,那么匹配语句将变得乏味。有没有办法表达类似的东西:

还是有不同的方法可以达到相同的结果?由于此处描述的限制,我已经考虑并放弃了计量单位。

0 投票
0 回答
118 浏览

f# - F# 中的参数化判别联合

可能重复:
带函数应用的类型化抽象语法树

我想要以下

也就是说,Apply接受一个函数和 at,并将 f 应用于 的“内容” t

但是它要求有t<'a, 'b, 'c>,这意味着我必须为所有使用三个参数t<_>。有没有办法绕过它?

非常感谢您的见解

0 投票
6 回答
413 浏览

f# - 在 F# 中,在有区别的联合中严格计算和记忆

我有一个受歧视的工会,例如

这基本上是一个链表,没有任何内容,例如Spam(Spam(Spam(Eggs))). 我想对这个结构进行严格的计算,比如计算长度,并记住结果。在普通类型中,我会使用类本地let绑定,但这些在可区分的联合中不可用。

一种方法是,

但这真的很混乱,当我需要的数据很容易计算时,但我仍然希望有更好的方法(不使用外部可变结构)。

0 投票
1 回答
165 浏览

design-patterns - 用于扩展可区分联合的“设计模式”

众所周知,类继承是“开放的”类型层次结构,而有区别的联合是“封闭的”类型层次结构。然而,虽然添加新的子类很容易,但添加新的虚函数需要修改所有现有类。同时,有区别的工会可以很容易地添加新的功能。

OOP 已经出现了足够多的时间,以至于我们经历了“向类型层次结构中添加新方法”的困难,并且在“修改所有类”不是一个好选择的情况下,我们提出了诸如访问者模式之类的东西为现有类型添加新功能。

例如:

因为添加虚拟Base.h()是困难的,所以我们使用访问者模式,所以可以封装未来的功能。这基本上是模式匹配函数的基于继承的类似物!

TLDR:是否有一种常见的抽象(类似于访问者模式)来处理向可区分联合添加类型?

0 投票
2 回答
2989 浏览

f# - F# Use generic type as pattern discriminator

If there's another way to achieve what I'm trying to do below, please let me know. Suppose I have the following sample code

I want to write a generic/higher-order version of isFoo that allows me to filter my list based on all other types of the discriminated union (Bar in this case).

Something like the following, where 'a can be either Foo or Bar

However, this attempt yields the following error:

error FS0039: The pattern discriminator 'a' is not defined

0 投票
2 回答
985 浏览

list - F# 联合类型列表

我想要一份报告清单。报告可以是详细信息或部分类型。

然后在我的代码中,我想做以下事情:

编译器在第一种情况下抱怨:“表达式应该具有报告类型,但这里有详细类型”,并且在第二种情况下适当地类似。

我是不是因为想做这样的事情而发疯了?我应该以不同的方式思考这个问题吗?因为报告是详细信息或摘要,报告列表不应该接受详细信息或摘要吗?如果不是详细信息或摘要列表,那么报告列表是什么?

谢谢。

0 投票
5 回答
329 浏览

list - 对联合类型的 F# 列表进行操作

这是我在F# List of Union Types上的问题的延续。多亏了有用的反馈,我能够创建一个Reports 列表,其中Report之一是DetailSummary。这是数据定义再次:

现在我已经Report在一个名为 的变量中获得了 s的列表reports,我想遍历这些Report对象并基于每个对象执行操作。除了处理Detail.Divisions或的情况外,操作是相同的Summary.Office。显然,我必须以不同的方式处理这些问题。但我不想复制所有代码来处理每个类似的State代码Sections

我的第一个(工作)想法类似于以下内容:

这将给我一种方法来知道何时处理Detail.Divisions而不是Summary.Office. 但这并没有给我一个可以使用的对象。我仍然坚持report,不知道它是什么,Detail或者Summary,也无法访问属性。我想转换report为适当的DetailorSummary然后使用相同的代码来处理任何一种情况,除了Detail.Divisionsand Summary.Office。有没有办法做到这一点?

谢谢。

0 投票
3 回答
302 浏览

f# - 在有区别的联合类型声明中使用活动模式

是否可以在有区别的联合类型声明中使用活动模式?

更准确地说,考虑以下玩具示例:

现在假设我想覆盖 T 中的 ToString()。在 T 的类型声明中,我不能引用 T_ToString,因为此时尚未声明 T_ToString。我无法在 ToString() 之前移动活动模式和 T_ToString ,因为此时尚未声明 T 。但这也不起作用:

0 投票
2 回答
180 浏览

f# - 理解歧视工会的推理

考虑以下代码...

正如评论中的那样,似乎无法推断返回结果应该是联合类型,如果我们必须要求对联合类型进行合格的访问,这是非常冗长的(这似乎是令人担忧的错误)。

也没有办法创建一个只接受联合类型并将它们作为联合返回的函数。(在这种情况下,一个函数接受 TypeOne 或 TypeTwo 并返回 UnionType)。或者有吗?是否有更好的方式与受歧视的工会合作?

0 投票
2 回答
371 浏览

f# - 从文件/数据库创建可区分的联合数据

对于像这样的表达式,我有一个有区别的联合(EQ =; GT >; 等)

我想从保存在文件/数据库中的此类表达式创建 DU 的实例。我该怎么做?如果不可行,在 F# 中处理它的最佳方法是什么?

Daniel:这些表达式以前缀格式(如上)保存为文本,将在 F# 中解析。谢谢。