问题标签 [coproduct]

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 回答
675 浏览

json - 我的副产品编码不明确

这个问题最近出现了几次,所以我在这里进行常见问题解答。假设我有一些这样的案例类:

我想使用circe和 Shapeless coproducts 将可能是其中任何一个的值编码为 JSON。

乍一看,这看起来不错:

但问题是我永远无法解码包含B元素的副产品,因为任何可以解码为的有效 JSON 文档B也可以解码为A,并且 circe-shapes 提供的副产品解码器按照它们出现在副产品。

如何在我的编码中消除我的副产品元素的歧义?

0 投票
0 回答
146 浏览

scala - 如何定义副产品编解码器的鉴别器值?

你能解释一下副产品是如何工作的吗?这是我的代码

我想我必须定义 coproduct 编解码器,ArdbData本测试所示。我还需要为我在discriminatedBy.using(). 当我开始测试它时,我突然发现.using没有使用来自的密钥。而是使用每个Discriminator实例的 ID。然后我注释掉Codec.coproduct[ArdbData]它仍然可以编译!为什么会编译?定义鉴别器价值的正确方法是什么?

0 投票
1 回答
856 浏览

scala - Shapeless:迭代 Coproduct 中的类型

我想做一些非常简单的事情,但我正在努力制作正确的搜索或只是理解我见过的一些解决方案。

给定一个采用 Coproduct 的泛型类型参数的方法;

如何迭代形成联产品的类型?具体来说,对于作为案例类的每种类型,我想递归地检查每个字段并构建一个包含所有信息的映射。

目前我正在使用构建器模式解决此问题,我将在此处发布以防对其他人有用;

0 投票
1 回答
77 浏览

scala - 如何使泛型只接受一些彼此不相关的数据类型

有一个完美的特质。但是,我想重构与泛型 [T] 相关的部分,以限制泛型 [T] 可以接受的数据类型(我只需要 Option[JsValue] , JsValue , StringEnumEntry , String )。是否可以通过无形的副产品来解决这个问题?也许还有其他解决方案?

0 投票
2 回答
192 浏览

haskell - 存在类型类 vs. 数据构造函数 vs. Coproducts

我发现自己在我的设计中遇到了相同的模式,我从一个带有几个数据构造函数的类型开始,最终希望能够针对这些数据构造函数进行类型化,从而将它们拆分为自己的类型,然后必须增加在我仍然需要表示多个这些类型(即集合)的情况下,需要使用 Either 或另一个标记联合来降低程序其他部分的冗长性。

我希望有人可以为我指出一种更好的方法来完成我想做的事情。让我从一个简单的例子开始。我正在为一个测试系统建模,您可以在其中拥有最终以测试结束的嵌套测试套件。所以,像这样:

所以,到目前为止非常简单,本质上是一个花哨的树/叶声明。但是,我很快意识到我希望能够制作专门用于测试的功能。因此,我现在将其拆分为:

或者,我可能会推出“自定义”Either(特别是如果示例更复杂并且有超过 2 个选项),例如:

所以,已经很不幸了,仅仅为了能够拥有一个Suite可以组合套件或测试的工具,我最终得到了一个奇怪的开销Either类(无论是实际Either的还是自定义的)。如果我使用存在类型类,我可以同时制作TestSuite派生“Node_”,然后拥有Suite一个上述Nodes 的列表。Coproducts 将允许类似的事情,我基本上会执行相同的Either策略而没有标签的冗长。

现在让我用一个更复杂的例子来扩展。测试的结果可以是 Skipped(测试被禁用)、Success、Failure 或 Omitted(由于先前的失败,测试或套件无法运行)。同样,我最初是这样开始的:

但我很快意识到我希望能够编写获取特定结果的函数,更重要的是,让类型本身强制执行所有权属性:一个成功的套件必须只有成功或跳过的孩子,失败的孩子可以是任何东西,省略只能自己省略了,等等。所以现在我得到了这样的结果:

同样,我现在有了这些奇怪的“包装器”类型,比如AnyResult,但是,我得到了过去只能从运行时操作中强制执行的东西的类型强制。有没有更好的策略不涉及打开存在类型类之类的功能?

0 投票
0 回答
160 浏览

scala - 用于模式匹配具有偏函数的无形联积的库

我有一个相对符合人体工程学的模式,我用它来匹配无形Coproduct的 s。它看起来基本上是这样的

这工作得很好,但我还没有经历定义CoproductNSyntax0-22 的麻烦。

我知道我们可以用 做类似的事情Poly1,但这需要定义一个单独的对象

我的问题是:是否有任何现有的库提供这种类型的模式来匹配Coproducts?

0 投票
1 回答
40 浏览

scala - 从参数化函数中获取参数化特征的具体实现

试图获得一个参数化函数,该函数将返回一个特征的指定联积。

如何在 Scala 2.11 中实现这一点?

0 投票
1 回答
121 浏览

scala - 无形中的副产品不编译

我正在尝试shapeless并正在尝试了解GenericCoproducts。这是我尝试过的:

我希望val t2与 完全相同val t1,但不幸的是它甚至没有编译:

这个错误确实不是很清楚,对我有帮助。你能解释一下最后一个案例出了什么问题吗?

0 投票
0 回答
74 浏览

scala - 在 Shapeless 中添加两个以上的联产品

我想将两个以上单独的 Coproducts 合并为一个:

ABCDEF 应该是Aa :+: Bb :+: Cc :+: Dd :+: Ee :+: Ff :+: CNil

我看到有Prepend,但我只能使用两个副产品:

0 投票
1 回答
86 浏览

scala - GADT Type as Shapeless Coproduct -- 如何用任意数量的代数构建解释器

假设我有两种 GADT 类型。

我为每种 GADT 类型都有一个解释器,它将打印出每个 GADT 子类型的描述。

我希望将两个 GADT 合并为一个名为 All 的 GADT

我可以通过硬编码所有 GADT 值来创建一个新的解释器。

但是,我想添加一堆 GADT 代数和解释器,并将它们任意组合成一个代数,所以我正在寻找一种更通用的方法来替换DualInterpreter上述内容。我可以看到类型签名类似于

我想抽象的主要是description方法内部的模式匹配,因为可用代数的数量可能会变得非常丑陋。它将有一个解释器,其中构造函数参数是解释器,并且模式匹配根据传递给描述方法的 ALG 类型委托给适当的解释器。